题目:http://poj.org/problem?id=2586
题目十分难懂啊,大意是:MS公司,对于每一个月来说,每个月的利润,如果盈利则盈利s,如果亏空则亏d(s和d是固定的)。MS每五个月进行一次统计,共统计八次(1-5月一次,2-6月一次.......)统计的结果,统计结果为这八次都是亏空的。现在要统计一年的最大利润。
假设12个月的利润为t1, t2, t3, t4,t5,……t11,t12(ti = s或者 -d)。因为每次统计都是亏损的,则t1 + t2 + t3 + ……t 5 < 0;则 至少存在一个 -d。为了使利润最大化,就得是-d的个数最少。因此,使用贪心算法。存在以下几种可能性:
1.ssssd循环. 则12个月为ssssdssssdss . 4s>d的情况
2.sssdd循环. 则12个月为sssddsssddss 3s>2d
3.ssddd循环. 则12个月为ssdddssdddss 2s>3d
4.sdddd循环. 则12个月为sddddsddddsd s>4d
5.ddddd循环. 则12个月为dddddddddddd
#include <stdio.h> #define ONLINE void online() { #ifdef ONLINE #else freopen("2586.in","r",stdin); freopen("2586.out","w",stdout); #endif } int s, d; int main() { online(); while (scanf("%d%d", &s, &d)!=EOF) { int result = -1; if (4*s < d) { result = 10 * s - 2 * d; } else if (3*s < 2 * d) { result = 8 * s - 4 * d; } else if (2*s < 3*d) { result = 6 * s- 6 * d; } else if (s < 4 * d) { result = 3 * s - 9 * d; } if (result < 0 ) { printf("Deficit\n"); } else { printf("%d\n", result); } } return 0; }运行结果:
2586 | Accepted | 164K | 16MS | C++ | 620B | 2011-07-31 16:24:54 |