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 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步