POJ 2586 Accounting Bug

题意

财政报告一次报五个月的财政情况,每次都是亏损,输入s,d 是每个月盈利或亏损的数额,输出一年最大的盈利数额,如果不可能盈利,则输出 Deficit。

分析

对于任意连续五个月,s与d的数量都是确定的,即和都为负数且最接近0。

证明:

假设存在s与d的个数与最优解的不同,则要么s多了,要么d多了。

如果s多了,则不满足和为负数,因为对于s与d数量最优的定义是和都为负数且最接近0。

如果d多了,则不满足最优,把d换成s肯定要更优。

证毕。

假设最优解为

1~5 :abcde

2~6 :bcdea

3~7 :cdeab

以此类推

最终答案即为  2(a+b+c+d+e)+a+b

所以我们只要枚举s与d在五个位置的分布情况即可,复杂度O(25),在从中找最优解,即满足a+b+c+d+e最大时,使a+b尽可能大。

#include<cstdio>
#include<cmath>
#include<iostream>
#define INF 0x3f3f3f3f
using namespace std;
int s[2];
int ans=-INF;
int main(){
    while(scanf("%d%d",&s[0],&s[1])!=EOF){
        s[1]=-s[1];
        ans=-INF;
        for(int i=0;i<(1<<5);i++){ //枚举  对于1表示亏损 d, 0表示盈利 s 
            int xx=0,yy=0;
            int x=i,len=5;
            while(len){
                yy+=s[x&1];
                if(len==1||len==2) xx+=s[x&1];
                len--;
                x>>=1;
            }
            if(yy<0) ans=max(ans,yy*2+xx);
        }
        if(ans<0) printf("Deficit\n");
        else printf("%d\n",ans);
    }
    return 0;
}

 

 

 

posted @ 2022-03-01 19:45  Aurora-JC  阅读(36)  评论(0编辑  收藏  举报