计算机机械师会计(ACM)遭受了千年虫的困扰,失去了一些为微软公司准备年度报告的重要数据。
他们只记得微软公司在1999年的每个月和每个月都公布盈余或赤字,当微软公司公布盈余时,盈余的数量是s,当微软公司公布赤字时,赤字是d。他们不记得公布盈余或赤字的是哪个月或几个月。与其他公司不同的是,微软公司在一年中连续5个月公布业绩。ACM知道这8个公告中的每一个都报告了赤字,但他们不知道赤字有多大。总会计师几乎肯定微软公司将在1999年全年公布盈余。几乎但不完全是。
写一个程序,决定微软公司在1999年是否出现赤字,或者如果1999年可能出现盈余,那么他们可以公布的最大盈余额是多少。
输入
输入是一系列行,每个行包含两个正整数s和d。
产量
对于每一行输入,输出一行,其中包含一个整数,给出全年的盈余金额,如果不可能,则输出赤字。
Sample Input
59 237
375 743
200000 849694
2500000 8000000
Sample Output
116
28
300612
Deficit
一看到这道题目,这是啥玩意,蒙圈了,题目完全看不懂啊。这个8个公告是个啥,连续5个月公布一下业绩,都是啥?一脸蒙圈。
去看了看题解,原来是每五个月 公布业绩,每月的业绩是盈余和亏损两种可能,但是题目已经说明确了,每五月公布一次业绩且每次公布都是赤字(一个月亏了也可以叫赤字,每个业绩的公布的赤字的意思就是前几个月的盈利都比亏的少,所以前几个月加起来是亏的,所以是赤字),这块很难懂,很难看懂题目。这个 8 次公告就是1-5 2-6 3-7 4-8 5-9 6-10 7-11 8-12 这8次总结 ,每次都是赤字,就是上面说的盈利总和小于亏的总和。要满足的条件是每次公布业绩都是赤字(上面说了意思了),而且是每5次,有这几种情况,5个月中有一次赤字,有两次赤字,有三次赤字,有四次赤字,有五次赤字,而且是这八次的每一次都会有赤字()。我们就有了这几种情况 :
在保证连续5个月都亏损的前提下,使得每5个月中亏损的月数最少.(s是盈利,d是亏损),毕竟是贪心,所以每五次都要尽量少的亏损,但还是要必须有 至少一次,所以就采用这种排列方式,否则就不是最少的亏损了(可以想想)。然后就是盈利最大值,因为就只有12 个月,每五个月 一个周期,就算每五个只有一个盈利,最后那两个月肯定是有盈利的 (除非全都是亏损),所以12个月份就全都算上就是盈利的最大值(说的有点不清楚,想想就会出来的)。
x=1: ssssd,ssssd,ss d>4s 赢利10个月 10s-2d
x=2: sssdd,sssdd,ss 2d>3s 赢利8个月 8s-4d
x=3: ssddd,ssddd,ss 3d>2s 赢利6个月 6s-6d
x=4: sdddd,sdddd,sd 4d>s 赢利3个月 3s-9d
x=5: ddddd,ddddd,dd 4d<s 无赢利
代码:
#include<stdio.h>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=1005;
#include<iostream>
typedef long long ll;
int main()
{
int s,d;
int res;
while(cin>>s>>d)
{
if(d>4*s)
res=10*s-2*d;
else if(2*d>3*s)
res=8*s-4*d;
else if(3*d>2*s)
res=6*(s-d);
else if(4*d>s)
res=3*(s-3*d);
else
res=-1;
if(res<0)
cout<<"Deficit"<<endl;
else
cout<<res<<endl;
}
return 0;
}
这道贪心,完全出乎我对贪心的想象,以前做惯了区间类的题目,不知如何下手。