Submission #109727

#TimeUsernameProblemLanguageResultExecution timeMemory
109727ArturgoTravelling Merchant (APIO17_merchant)C++14
100 / 100
82 ms3320 KiB
#include <iostream> #include <vector> using namespace std; const long long INFINI = 1000ll * 1000 * 1000ll; int nbMarches, nbChemins, nbObjets; int achats[100][1000]; int ventes[100][1000]; long long temps[100][100]; int benefices[100][100]; long long valeurs[100][100]; bool estPossible(long long profit) { for(int iDeb = 0;iDeb < nbMarches;iDeb++) { for(int iFin = 0;iFin < nbMarches;iFin++) { valeurs[iDeb][iFin] = profit * temps[iDeb][iFin] - benefices[iDeb][iFin]; } valeurs[iDeb][iDeb] = INFINI; } for(int iPivot = 0;iPivot < nbMarches;iPivot++) { for(int iDeb = 0;iDeb < nbMarches;iDeb++) { for(int iFin = 0;iFin < nbMarches;iFin++) { valeurs[iDeb][iFin] = min(valeurs[iDeb][iFin], valeurs[iDeb][iPivot] + valeurs[iPivot][iFin]); } } } for(int iMarche = 0;iMarche < nbMarches;iMarche++) { if(valeurs[iMarche][iMarche] <= 0) return true; } return false; } int main() { ios_base::sync_with_stdio(false); cin >> nbMarches >> nbChemins >> nbObjets; for(int iMarche = 0;iMarche < nbMarches;iMarche++) { for(int iObjet = 0;iObjet < nbObjets;iObjet++) { cin >> achats[iMarche][iObjet] >> ventes[iMarche][iObjet]; } } for(int iDeb = 0;iDeb < nbMarches;iDeb++) for(int iFin = 0;iFin < nbMarches;iFin++) temps[iDeb][iFin] = INFINI; for(int iChemin = 0;iChemin < nbChemins;iChemin++) { int deb, fin, t; cin >> deb >> fin >> t; temps[deb - 1][fin - 1] = t; } for(int iPivot = 0;iPivot < nbMarches;iPivot++) { for(int iDeb = 0;iDeb < nbMarches;iDeb++) { for(int iFin = 0;iFin < nbMarches;iFin++) { temps[iDeb][iFin] = min(temps[iDeb][iFin], temps[iDeb][iPivot] + temps[iPivot][iFin]); } } } for(int iDeb = 0;iDeb < nbMarches;iDeb++) { for(int iFin = 0;iFin < nbMarches;iFin++) { int benefice = 0; for(int iObjet = 0;iObjet < nbObjets;iObjet++) { if(ventes[iFin][iObjet] != -1 && achats[iDeb][iObjet] != -1) benefice = max(benefice, ventes[iFin][iObjet] - achats[iDeb][iObjet]); } benefices[iDeb][iFin] = benefice; } } int deb = 0, fin = 1000000000 + 1; while(fin - deb > 1) { int mil = (deb + fin) / 2; if(estPossible(mil)) { deb = mil; } else { fin = mil; } } cout << deb << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...