/* * ===================================================================================== * * Filename: poj2568 * * Description: 建一个数组,判断五个里面至少要多少个d才能满足 * deficit的条件,然后就是贪心每次找最远的一个,标记成d * 如果4个d都不能满足,则也输出deficit. * 看了比人枚举也能得出结果。非常简洁。单数如果范围再大点就不行 * 了。 * Version: 1.0 * Created: 2012/5/9 1:08:44 * Revision: none * Compiler: gcc * * Author: Jason Damon * Organization: XD Universiy * * ===================================================================================== */ #include <stdlib.h> #include <iostream> #include <fstream> using namespace std; int month[12]; //0表示s,1表示d int s,d; int main() { int i,j,max,cnt; freopen("in.txt","r",stdin); while(scanf("%d%d",&s,&d)!=EOF) { memset(month,0,sizeof(month)); for(i=4; i>=1; i--) { if(i*s-d*(5-i)<0) { max=5-i; //至少需要d的个数 break; } } if(i==0) { printf("Deficit\n"); continue; } cnt=0; for(j=4; j>=0 && max>0; j--,max--) { month[j]=1; cnt++; } for(i=j; i<12; i++) { if(month[i+1]==1 && i+1<12) { if(i+6<12) { month[i+6]=1; cnt++; } } } int su=s*(12-cnt)-d*cnt; if(su>0) { printf("%d\n",su); } else { printf("Deficit\n"); } } return 0; }
下面是别人枚举的方法:
#include<stdio.h> int main(){ int s,d,ans; while(scanf("%d%d",&s,&d)!=EOF){ if(s-4*d>0)ans=-1;//无论如何都亏 else if(4*s-d<=0)ans=10*s-2*d;//即: ssssd,ssssd,ss else if(3*s-2*d<=0)ans=8*s-4*d;//即:sssdd,sssdd,ss else if(2*s-3*d<=0)ans=6*s-6*d;//即:ssddd,ssddd,ss else if(s-4*d<=0)ans=3*s-9*d;//即: sdddd,sdddd,sd else ans=-1;//亏 if(ans<0)puts("Deficit"); else printf("%d\n",ans); } return 0; }