背景:再做这道题的时候,我严重怀疑我的英语能力,o(︶︿︶)o 唉,翻译了一个多小时。
思路:由于本题情况比较少,所以可以直接枚举出所有的情况,首先要找出五个月中最少亏损月份,然后就开始枚举出五种情况,最后输出即可。
#include <stdio.h>
void print(int n)
{
if(n<0) printf("Deficit\n");
else printf("%d\n",n);
}
void YinKui(int m,int s,int d)
{
int n=0;
if(m==1) n=10*s-2*d;
else if(m==2) n=8*s-4*d;
else if(m==3) n=6*s-6*d;
else if(m==4) n=3*s-9*d;
else n=-1;
print(n);
}
void Deficit_Month(int s,int d)
{
int m;
if(d>4*s) m=1;
else if(d*2>3*s) m=2;
else if(d*3>2*s) m=3;
else if(d*4>s) m=4;
else m=5;
YinKui(m,s,d);
}
int main(void)
{
int s,d;
while(scanf("%d %d",&s,&d)==2)
Deficit_Month(s,d);
return 0;
}
然后看了同学的代码,发现也可以用贪心算法。
下面附同学的代码
#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;
}