这题题意是别人告诉的,现在这里表示感谢了。
题目就是说给定一个盈利和一个亏损值,(一个月只可能盈利或者亏损)一年12个月,任意连续5个月的和值必须亏损。求十二个月的最大盈利是多少?
解题思路:
先确定前五个月的安排情况,把亏损的尽量安排靠后,然后再从2月到8月为起点进行暴力,每次能够新确定一个月的盈亏情况(根据5月之和小于零)。最后再确认12个月是否盈利。
代码如下:
#include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> using namespace std; int s, d, seq[15]; void deal() { int c; for (int i = 4; i >= 0; --i) { c = s*i+(5-i)*d; if (c < 0) { c = i; // puts("HHKHK"); break; } // 找出临界的第一个五月亏损,且盈利的月数尽可能的多 } for (int i = 1; i <= c; ++i) { seq[i] = s; } for (int i = c+1; i <= 5; ++i) { seq[i] = d; } for (int i = 2; i <= 8; ++i) { int k = i + 3, temp = 0; for (int j = i; j <= k; ++j) { temp += seq[j]; } if (temp + s < 0) { seq[i+4] = s; } else { seq[i+4] = d; } } } int main() { int ans; while (scanf("%d %d", &s, &d) == 2) { ans = 0; d *= -1; // d 为负数表示亏损 deal(); for (int i = 1; i <= 12; ++i) { ans += seq[i]; } printf(ans > 0 ? "%d\n" : "Deficit\n", ans); } return 0; }