题目链接:http://poj.org/problem?id=2586
这题依然是贪心算法。就是题意有点难理解。。大意是给出盈利和亏损,然后只知道每连续的五个月(总共八个··1-5 2-6 3-7······8-12)一定是亏损的,,要求出最后是否有可能盈利,最大可能是多少。。
思路:我的想法是将1-5月的每个月的盈利或亏损的情况求出来,,简单的找规律会发现把这五个月平移到6-10,1、2月给11、12就行了。。求前五个月的详细情况我已开始居然想用类似dfs的方法做···· 估计是之前专题里练了两题导致的吧····就是先将五个月都放上盈利的,再逐一替换最后面的那个数,知道这五个月总共变成了亏损就行了。。
后来又仔细想了一下发现只要简单的算术就可以把前五个月的情况求出来。。于是我又写了一下。。
这里附上ac代码一。。
#include<stdio.h>
#include<string.h>
int s,d;
int flag=0;
int a[15],p[5];
int sum()
{
int i,q=0;
for(i=0;i<5;i++)
{
q+=a[i];
}
return q;
}
void dfs(int depth)
{
int i;
if(flag) return;
if(depth==5)
{
if(sum()<0)
flag=1;
return;
}
for(i=0;i<2;i++)
{
a[depth]=p[i];
dfs(depth+1);
if(flag) break;
}
}
int main ()
{
while (scanf("%d%d",&s,&d)==2)
{
flag=0;
p[0]=s;
p[1]=-d;
dfs(0);
int temp=0;
/*for(int i=0;i<5;i++)
printf("%d ",a[i]);*/
for(int i=5;i<12;i++)
a[i]=a[i-5];
for(int i=0;i<12;i++)
temp+=a[i];
if(temp>0)
printf("%d\n",temp);
else printf("Deficit\n");
}
return 0;
}
ac代码二:
#include<stdio.h>
int a[15];
int main ()
{
int s,d;
while (scanf("%d%d",&s,&d)==2)
{
int sum=0;
int i,j;
for(i=5;i>=0;i--) //一定要写成i>=0 若写成i>0可能出现一种情况i=1的时候sum>0 然后由于i>0退出了 sum仍然>0
{ //写成i>=0 则上面那种情况变成i=1时sum>0,i=0时sum<0 break
sum=i*s-(5-i)*d;
if(sum<0)break;
}
for(j=0;j<i;j++)
a[j]=s;
for(j=i;j<5;j++)
a[j]=-d;
for(i=5;i<12;i++)
{
a[i]=a[i-5];
sum+=a[i];
}
if(sum>0)
printf("%d\n",sum);
else printf("Deficit\n");
}
return 0;
}