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分???

posted @ 2019-06-11 19:32  JBLee  阅读(158)  评论(0编辑  收藏  举报