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 }
来源:https://www.cnblogs.com/ldudxy/p/12046834.html