zoukankan      html  css  js  c++  java
  • 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
    ",ans);
        }
        return 0;
    }

    但不知为何迷之80分???

  • 相关阅读:
    微软Silverlight 2.0 最新版本GDR发布
    POJ 2635, The Embarrassed Cryptographer
    POJ 3122, Pie
    POJ 1942, Paths on a Grid
    POJ 1019, Number Sequence
    POJ 3258, River Hopscotch
    POJ 3292, Semiprime Hnumbers
    POJ 2115, C Looooops
    POJ 1905, Expanding Rods
    POJ 3273, Monthly Expense
  • 原文地址:https://www.cnblogs.com/LJB666/p/11005550.html
Copyright © 2011-2022 走看看