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; }
本文作者:Aurora-JC
本文链接:https://www.cnblogs.com/jiangchen4122/p/15952116.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
标签:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步