Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- using namespace std;
- int dolzina, budget, n;
- int DP[100][10001];
- bool iskoristeno[100][10001];
- int xi[100],ci[100],ri[100];
- int solve (int kandelabri, int b)
- {
- int so_koristenje_kandelabra=0;
- int bez_koristenje_kandelabra;
- int osvetleni_polinja=ri[kandelabri]*2;
- if(xi[kandelabri]+ri[kandelabri]>dolzina) //Канделабрата свети и после крајот на патеката, не треба да се брои тој дел
- osvetleni_polinja-=xi[kandelabri]+ri[kandelabri]-dolzina;
- if(xi[kandelabri]-ri[kandelabri]<0) //Канделабрата свети и пред почетокот на патеката, не треба да се брои тој дел
- osvetleni_polinja-=ri[kandelabri]-xi[kandelabri];
- if(b<=0)
- return 0; // Без пари не работат канделабрите
- if(DP[kandelabri][b]!=-1) //Веќе имаме пресметано резултат
- return DP[kandelabri][b];
- if(b >= ci[kandelabri]) //Можеме со тој буџет да ја платиме канделабрата
- so_koristenje_kandelabra=solve(kandelabri-1,b-ci[kandelabri])+osvetleni_polinja;
- bez_koristenje_kandelabra=solve(kandelabri-1,b);
- if(so_koristenje_kandelabra>bez_koristenje_kandelabra)
- {
- iskoristeno[kandelabri][b]=true;
- DP[kandelabri][b]=so_koristenje_kandelabra;
- }
- else
- DP[kandelabri][b]=bez_koristenje_kandelabra;
- return DP[kandelabri][b];
- }
- int main()
- {
- cin>>dolzina>>budget>>n;
- memset(DP,-1,sizeof(int)*100*10001); // Ја иницираме матрицата DP на -1
- memset(iskoristeno,false,sizeof(bool)*100*10001); //Ја иницираме матрицата iskoristeno на false
- for(int i=0;i<n;i++)
- cin>>xi[i]>>ci[i]>>ri[i];
- cout<<solve(n-1,budget)<<" ";
- int osvetleno[dolzina];
- memset(osvetleno,0,sizeof(int)*dolzina);
- for(int i=n-1;i>=0;i--)
- if(iskoristeno[i][budget])
- {
- int start=max(0,xi[i]-ri[i]); //Да не излеземе надвор од меморија (негативен брјо)
- int kraj=min(dolzina-1,xi[i]+ri[i]-1); //Да не излеземе надвор од меморија (број поголем од патеката)
- for(int j=start;j<=kraj;j++)
- osvetleno[j]=1;
- budget-=ci[i];
- }
- int najgolem_neosvetlen_interval=0;
- if(!osvetleno[0])
- osvetleno[0]=1;
- for(int i=1;i<dolzina;i++)
- if(!osvetleno[i])
- {
- osvetleno[i]=osvetleno[i-1]+1;
- najgolem_neosvetlen_interval=max(najgolem_neosvetlen_interval,osvetleno[i]);
- }
- else
- osvetleno[i]=0;
- cout<<najgolem_neosvetlen_interval;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment