add1ctus

Велосипедска патека

Feb 21st, 2015
766
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.88 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3.  
  4. using namespace std;
  5.  
  6. int dolzina, budget, n;
  7. int DP[100][10001];
  8. bool iskoristeno[100][10001];
  9. int xi[100],ci[100],ri[100];
  10.  
  11. int solve (int kandelabri, int b)
  12. {
  13.     int so_koristenje_kandelabra=0;
  14.     int bez_koristenje_kandelabra;
  15.     int osvetleni_polinja=ri[kandelabri]*2;
  16.  
  17.     if(xi[kandelabri]+ri[kandelabri]>dolzina) //Канделабрата свети и после крајот на патеката, не треба да се брои тој дел
  18.         osvetleni_polinja-=xi[kandelabri]+ri[kandelabri]-dolzina;
  19.  
  20.     if(xi[kandelabri]-ri[kandelabri]<0) //Канделабрата свети и пред почетокот на патеката, не треба да се брои тој дел
  21.         osvetleni_polinja-=ri[kandelabri]-xi[kandelabri];
  22.  
  23.     if(b<=0)
  24.         return 0; // Без пари не работат канделабрите
  25.  
  26.     if(DP[kandelabri][b]!=-1) //Веќе имаме пресметано резултат
  27.         return DP[kandelabri][b];
  28.  
  29.     if(b >= ci[kandelabri]) //Можеме со тој буџет да ја платиме канделабрата
  30.         so_koristenje_kandelabra=solve(kandelabri-1,b-ci[kandelabri])+osvetleni_polinja;
  31.  
  32.     bez_koristenje_kandelabra=solve(kandelabri-1,b);
  33.  
  34.     if(so_koristenje_kandelabra>bez_koristenje_kandelabra)
  35.     {
  36.         iskoristeno[kandelabri][b]=true;
  37.         DP[kandelabri][b]=so_koristenje_kandelabra;
  38.     }
  39.     else
  40.         DP[kandelabri][b]=bez_koristenje_kandelabra;
  41.  
  42.     return DP[kandelabri][b];
  43. }
  44.  
  45. int main()
  46. {
  47.     cin>>dolzina>>budget>>n;
  48.  
  49.     memset(DP,-1,sizeof(int)*100*10001); // Ја иницираме матрицата DP на -1
  50.     memset(iskoristeno,false,sizeof(bool)*100*10001); //Ја иницираме матрицата iskoristeno на false
  51.  
  52.     for(int i=0;i<n;i++)
  53.         cin>>xi[i]>>ci[i]>>ri[i];
  54.  
  55.     cout<<solve(n-1,budget)<<" ";
  56.  
  57.     int osvetleno[dolzina];
  58.     memset(osvetleno,0,sizeof(int)*dolzina);
  59.  
  60.     for(int i=n-1;i>=0;i--)
  61.         if(iskoristeno[i][budget])
  62.         {
  63.             int start=max(0,xi[i]-ri[i]); //Да не излеземе надвор од меморија (негативен брјо)
  64.             int kraj=min(dolzina-1,xi[i]+ri[i]-1); //Да не излеземе надвор од меморија (број поголем од патеката)
  65.             for(int j=start;j<=kraj;j++)
  66.                 osvetleno[j]=1;
  67.             budget-=ci[i];
  68.         }
  69.  
  70.  
  71.     int najgolem_neosvetlen_interval=0;
  72.  
  73.     if(!osvetleno[0])
  74.         osvetleno[0]=1;
  75.  
  76.     for(int i=1;i<dolzina;i++)
  77.         if(!osvetleno[i])
  78.         {
  79.             osvetleno[i]=osvetleno[i-1]+1;
  80.             najgolem_neosvetlen_interval=max(najgolem_neosvetlen_interval,osvetleno[i]);
  81.         }
  82.         else
  83.             osvetleno[i]=0;
  84.  
  85.  
  86.  
  87.     cout<<najgolem_neosvetlen_interval;
  88.  
  89.     return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment