Codeforces Round #608 (Div. 2)D(贪心)

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 int a[5007],b[5007],c[5007];
 5 int u,v;
 6 int remain[5007],least[5007];
 7 pair<int,int>pc[5007];
 8 vector<int>road[5007];
 9 bool cmp(int a,int b){
10     return a>b;
11 }
12 int main(){
13     ios::sync_with_stdio(false);
14     cin.tie(NULL);
15     cout.tie(NULL);
16     int n,m,k;
17     cin>>n>>m>>k;
18     for(int i=1;i<=n;++i){
19         cin>>a[i]>>b[i]>>c[i];
20         pc[i]={c[i],i};
21     }
22     for(int i=1;i<=m;++i){
23         cin>>u>>v;
24         road[v].push_back(u);
25     }
26     int num=k;
27     int flag=0;
28     for(int i=1;i<=n;++i){
29         if(num>=a[i]){
30             num+=b[i];
31         }
32         else{
33             flag=1;
34         }
35     }
36     if(flag){
37         cout<<-1;
38         return 0;
39     }
40     least[n]=a[n];//当前至少要有的士兵数量,否则就算以后全部招募且不派兵防守也无法攻下所有城堡
41     for(int i=n-1;i;--i){
42         least[i]=least[i+1]-b[i];
43         least[i]=max(a[i],least[i]);
44     }
45     for(int i=n;i;--i){
46         remain[i]=num-least[i+1];//当前可以用来防守的士兵数量
47         num-=b[i];
48     }
49     int ans=0;
50     sort(pc+1,pc+1+n);
51     for(int i=1;i<=n;++i){
52         road[i].push_back(i);
53         sort(road[i].begin(),road[i].end(),cmp);
54     }
55     for(int i=n;i;--i){
56         int x=pc[i].first,y=pc[i].second;
57         for(auto it:road[y]){
58             if(remain[it]>0){
59                 int flag=0;
60                 for(int j=it;j<=n;++j)
61                     if(remain[j]==0){
62                         flag=1;//如果后面有等于0的话,这里派兵防守,后面就不够攻打城堡了
63                         break;
64                     }
65                 if(!flag){
66                     ans+=x;
67                     for(int j=it;j<=n;++j)
68                         --remain[j];
69                 }
70                 break;
71             }
72         }
73     }
74     cout<<ans;
75     return 0;
76 }

猜你喜欢

转载自www.cnblogs.com/ldudxy/p/12046834.html