44882023-03-28 22:17:47AncsaBenzinkút üzemeltetés (55)cpp11Időlimit túllépés 6/55300ms11212 KiB
#include <bits/stdc++.h>

using namespace std;

/*
5 20
10 10
20 40
30 10
40 20
50 30
*/

void grafir(vector<vector<int>> a)
{
   cout<<endl;
   cout<<"sorok szama"<<a.size()<<endl;
   for(int i=0;i<a.size();i++)
   {
       for(int j=0;j<a.at(i).size();j++)
           cout<<a.at(i).at(j)<<"\t";
       cout<<endl;
   }
   cout<<endl;
}

void dij(vector<vector<int>> g, int start, vector<int> &kapcs, vector<long long> &nagyok)
/*
g-szomszedsagi matrix, a csucsok jelolese 1-tol indul
start az indulo csucs
kapcs-kimeno vector megmutatja h melyik csucsba honnan jutunk
aprok-kimeno vector minden csucshoz megmutatja hogy mennyia  legrovedebb  ut koltsege
       olyan vectorrl hivjuk meg amiben NAGY kezdoertekek vannak
*/
{
    int nn=g.size();
    vector<int> kesz(nn);
    vector<long long> maxok(nn);

    kapcs.at(start)=-1;
    maxok.at(start)=0;
    long long akt=start;
    int hanyadik=0;

    while (hanyadik<nn)
    {
       for(int i=1;i<nn;i++)
          if(g.at(akt).at(i)!=0 && !kesz.at(i) && nagyok.at(i)<nagyok.at(akt)+g.at(akt).at(i))
          {
             maxok.at(i)=g.at(akt).at(i)+maxok.at(akt);
             kapcs.at(i)=akt;
          }
       kesz.at(akt)=1;
       long long nagy=maxok.at(0);
       int nagyindex=0;

       for(int i=0;i<nn-1;i++)
            if (maxok.at(i)>nagy && kesz.at(i)==0)
            {
               nagy=maxok.at(i);
               nagyindex=i;
            }
       akt=nagyindex;
       hanyadik++;
    }
    nagyok=maxok;
}

void utkeres(int start, int hova, vector<int> kapcs, vector<int> &lista)
{
   if(kapcs.at(hova)==-1)
   {
       lista.push_back(start);
       return;
   }
   else
   {
       utkeres(start, kapcs.at(hova),kapcs, lista);
       lista.push_back(hova);
   }
}

int main()
{
    int n, k;
    cin>>n>>k;
    vector<pair<int,int>> kutak(n+2);

    for(int i=1;i<n+1;i++)
        cin>>kutak.at(i).first>>kutak.at(i).second;
    kutak.at(n+1).first=kutak.at(n).first+k+10;
    kutak.at(n+1).second=0;
/*
    for(pair<int,int> x:kutak)
            cout<<x.first<<" " <<x.second<<endl;
 */
    int meret=n+2;
    vector<vector<int>> graf(n+2);
    for(int i=0;i<n+2;i++)
       graf.at(i).resize(n+2);


    for( int i=1;i<kutak.size();i++)
    {

       for(int j=i+1; j<n+2;j++)
          if (kutak.at(j).first-kutak.at(i).first>=k)
          {
            graf.at(i).at(j)=kutak.at(i).second;
          }
    }

    //grafir(graf);


    vector <long long> nagyprofit(n+2,-10);
    vector <int> kapcsolat (n+2);
    long long jo=-100;
    int joindex=0;

    for(int i=1;i<n;i++)
    {
       dij(graf,i, kapcsolat, nagyprofit);
       /*cout<<kutak.at(i).first<< "-es kut: \n";
       cout<<"Profit: \n";
       for(int x: nagyprofit)
           cout<<x<<" ";
       cout<<endl;
       cout<<"kapcsolati vector: \n";
       for(int x: kapcsolat)
           cout<<x<<" ";
       cout<<endl;*/
       if (nagyprofit.at(n+1)>jo)
       {
           jo=nagyprofit.at(n+1);
           joindex=i;
       }
    }
    dij(graf, joindex, kapcsolat, nagyprofit);
    vector<int> ut;
    utkeres(joindex,n+1,kapcsolat,ut);

    cout<</*"A legnagyobb profit: "<<*/jo<<endl;
    cout<<ut.size()-1<<" ";
    for(int i=0;i<ut.size()-1;i++)
        cout<<ut.at(i)<<" ";
    return 0;
}

RészfeladatÖsszpontTesztVerdiktIdőMemória
base6/55
1Elfogadva0/03ms1712 KiB
2Időlimit túllépés0/0300ms9220 KiB
3Elfogadva3/33ms2228 KiB
4Elfogadva3/33ms2320 KiB
5Hibás válasz0/33ms2532 KiB
6Hibás válasz0/33ms2652 KiB
7Hibás válasz0/33ms2896 KiB
8Hibás válasz0/33ms3108 KiB
9Hibás válasz0/37ms3384 KiB
10Hibás válasz0/39ms3632 KiB
11Hibás válasz0/316ms3792 KiB
12Időlimit túllépés0/3300ms4804 KiB
13Időlimit túllépés0/4275ms5712 KiB
14Időlimit túllépés0/4280ms6872 KiB
15Időlimit túllépés0/5268ms8392 KiB
16Időlimit túllépés0/6259ms9560 KiB
17Időlimit túllépés0/6268ms11212 KiB