正文索引 [隐藏]

传送门

冷知识:Y2K就是常说的千年虫。(这题的题意是真的搞,建议语文太差的人不要参与出题)

题目大意

微软公司每个月都可能盈余s元或者亏损d元,但具体是盈余还是亏损不知道。知道的是每连续的五个月统计一次总收入,都是亏损的(不难知道这样的统计一共有八次)。现问在这种条件下一年到头能盈利吗?如果能,找出最大盈利,如果不能就输出”Deficit”。

思路

这题抛开晦涩难懂的题干,其实挺简单的,两位数的数据范围,怎么都能过。有一种做法是统计出所有可能出现的盈亏情况,然后直接对sd判断就行了。

但我本着练算法的原则刷oj,肯定还是采用贪心的思路。

先假设每个月都是盈利的,然后对每个连着的五个月进行判断。如果满足题设的“亏损”条件,就挪到下一个连续的五个月继续判断;如果不满足,就将当前五个月中最后一个不亏损的月份置为亏损,继续上述操作。

代码

#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

int s, d;
int arr[20];

int calcSum(int pos) {
	int res = 0;

	for(int i = pos; i < pos + 5; i++)
		res += arr[i];

	return res;
}

int main() {
	while(~scanf("%d%d", &s, &d)) {
		d = -d;
		for(int i = 0; i < 12; i++) arr[i] = s;

		for(int i = 0; i < 8; i++) {
			for(int j = 1; j <= 5; j++) {
				int sum = calcSum(i);
				if(sum >= 0) arr[i + 5 - j] = d;
				else break;
			}
		}
		
		int totSum = 0;
		for(int i = 0; i < 12; i++) totSum += arr[i];

		if(totSum >= 0) printf("%d\n", totSum);
		else puts("Deficit");
	}

	return 0;
}