pku 2586 Y2K Accounting Bug 第一周训练——贪心

http://poj.org/problem?id=2586

刚开始看了很长时间都没看懂题意,最后还是看了discuss里面讲的才懂了。开始还把连续五个月都会抱亏的题意理解错了。我理解成1 - 5 6 - 10 11-12 了。。心想怎么会一年8次呢。最后才看到原来是1-5 2-6 3 -7 4 - 8 5 -9 6 -10 7 -11 8 -12这8次报表时都是亏空的。而每个月可能盈利,也可能亏空所以这样就会导致全年盈利的情况了。

这题的贪心在于,这8次中,出了第一次每一次都会和上一次重复利用连续的四个月的盈亏情况,所以我们贪心的让他们共用亏空,这样就会使盈利的月份增多,所以能够获得最大利润。

View Code
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#define maxn 13
using namespace std;

bool month[maxn];
int main()
{
int i,j;
int s,d;
while (~scanf("%d%d",&s,&d))
{
memset(month,false,sizeof(month));
int dnum = 0;
while (dnum*d < (5 - dnum)*s && dnum <= 5)//首先确定最多能够有多少个月是盈利的
//并且亏空的要放在这5个月的最后面,因为这样可以让后面的5个连续月共用
{
month[5 - dnum] = true;
dnum ++;
}
int count = 0;
for (i = 2; i <= 8; ++i)
{
count = 0;
for (j = i; j <= i + 4; ++j)
{
if (month[j]) count++;
if (j == i + 4 && count < dnum)//因为是连续的推过来的,如果少了亏空月份肯定是少了一个
//则在最后补充一个即可
month[j] = true;
}
}
count = 0;
for (i = 1; i < 13; ++i)
{
if (month[i]) count++;
}
int sum = s*(12 - count) - d*(count);
if (sum > 0)
{
printf("%d\n",sum);
}
else
printf("Deficit\n");
}
return 0;
}

第二种是直接退出来的各种情况。

1、若SSSSD亏空,那么全年可能最大盈利情况为: SSSSDSSSSDSS

      2、若SSSDD亏空,那么全年可能最大盈利情况为:SSSDDSSSDDSS

      3、若SSDDD亏空,那么全年可能最大盈利情况为: SSDDDSSDDDSS

      4、若SDDDD亏空,那么全年可能最大盈利情况为: SDDDDSDDDDSD

      5、若DDDDD亏空,那么全年可能最大盈利情况为: DDDDDDDDDDDD

View Code
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#define maxn 13
using namespace std;

int main()
{

int s,d;
while (~scanf("%d%d",&s,&d))
{
int sum = -1;
if (4*s < d)
sum = 10*s - 2*d;
else if (3*s < 2*d)
sum = 8*s - 4*d;
else if (2*s < 3*d)
sum = 6*s - d*6;
else if (s < 4*d)
sum = 3*s - 9*d;
if (sum > 0)
{
printf("%d\n",sum);
}
else
printf("Deficit\n");
}
return 0;
}





你可能感兴趣的:(count)