POJ-2586 Y2K Accounting Bug 贪心

这题题意是别人告诉的,现在这里表示感谢了。

题目就是说给定一个盈利和一个亏损值,(一个月只可能盈利或者亏损)一年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;    
}
posted @ 2012-06-29 11:28  沐阳  阅读(180)  评论(0编辑  收藏  举报