2019西安联训B层 Day 5 test T1 X 国的军队
考试时看到这道题感觉还行,用的是贪心+dp的处理方法,首先我们将所有城市所用兵力和火力值的差值排一道序,然后我用了一个dp数组f[]表示在第i座城市所用的最少兵力
那么又如何来转移呢,见代码。
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+7; int T; struct node{ int a,b,c; }ss[2*maxn]; int n; long long ans; long long f[maxn],res[maxn]; long long min(long long a,long long b){ return a<b; } bool cmp(node s1,node s2){ return s1.c>s2.c; } int main() { scanf("%d",&T); while(T--){ scanf("%d",&n); ans=0; for(int i=1;i<=n;i++){ ss[i].a=0; ss[i].b=0; f[i]=0; res[i]=0; } for(int i=1;i<=n;i++){ scanf("%d%d",&ss[i].a,&ss[i].b); ss[i].c=ss[i].b-ss[i].a; } sort(ss+1,ss+1+n,cmp); f[1]=ss[1].b; res[1]=ss[1].b-ss[1].a;//剩余的兵力 for(int i=2;i<=n;i++){ if(res[i-1]>=ss[i].b){//足够攻下下一座城 f[i]=0;//就不需要增加兵力 res[i]=res[i-1]-ss[i].a;//损失 } else{ f[i]=ss[i].b-res[i-1];//所需补充的兵力转移 res[i]+=ss[i].b-ss[i].a;//剩余的兵力 } } for(int i=1;i<=n;i++){ ans+=f[i];//统计,因为每个f[i]里保存的都是最优值 } printf("%lld\n",ans); } return 0; }
但不知为何迷之80分???