【水题】POJ 2586 Y2K Accounting Bug

这段时间要沉迷刷题一段时间了,就让CSDN陪我一起吧!

一、题目大意

这道题难就难在题目上,题目读懂了,这其实就是一道水题,不瞒大家说,我就没读懂。

其实意思也很简单,就是一个公司,每个月要么盈利s元,要么亏损d元,而且要保证在一年中任意连续5个月的营业额是亏损的,问一年中的盈利情况,如果盈利,则输出最大可能的盈利数额,如果亏损,则直接输出Deficit。

二、题目思路以及AC代码

在这里我就不得不推销一波codeforce了,我自己感觉在codeforce上还是学到了很多东西的,而且题目说的也更加清晰,没有像其他oj那样会出莫名其妙的问题。

回归正题,这道题用到了贪心的思想,但说白了还是找规律。如果想让任意连续5个月的营业额赤字,而且保证全年营业额尽可能的盈利,那么就可以确定这样一个贪心策略,即对一开始的5个月要保证赤字,且把亏损的月份放在后面,这样可以保证不用新添加亏损月就可以满足后面尽可能多的赤字,可能语言有点难理解,不过后面我会举例说明。然后对紧接着的5个月还是这样分配,直到最后。

下面举个例子进行说明。对于样例59 237,其贪心做法如下,前五个月要保证赤字,而且要营业额尽可能盈利,那么第一个月盈利59,第二个月盈利59,…,第四个月盈利59,最后一个月亏损237,可以保证这5个月是亏损1元,满足要求,为什么要让前四个月盈利,第五个月亏损呢?那是因为这样的话,可以仅用第五个月的亏损,保证许多区间的满足条件,1-5月满足条件,2-6月也满足,同理3-7月,4-8月,5-9月都满足,相信到这里大家就也理解了,这个贪心策略不需要证明,一看就理解。

下面给出AC代码:

#include <iostream>
using namespace std;

int month[12];

int main()
{
	int s, d;

	while (cin >> s >> d) {
		int num = 0;
		for (; num < 5; num++) {
			if (num*s >= (5 - num)*d) {
				break;
			}
		}
		num--;

		for (int i = 0; i < 12; i++) {
			int n = i % 5;
			if (n < num) month[i] = s;
			else month[i] = -d;
		}

		int sum = 0;
		for (int i = 0; i < 12; i++) {
			sum += month[i];
		}

		if (sum >= 0) cout << sum << endl;
		else cout << "Deficit" << endl;
	}

    return 0;
}

如果有问题,欢迎大家指正!!!

猜你喜欢

转载自blog.csdn.net/m0_38055352/article/details/92008478