HDU 1789

主要是一个思路:

按照 reduced socres 从大到小排序, deadline 从大到小或者从小到大都可以。假设这里的deadline是从小到大的

例如有这样一组数据

1 2 2 4 4 4
5 2 4 5 5 5

排序完之后:首先安排 reduced为5的,第一天就有事情做了,然后查找到第四天的,随后第四天也有事情做了,再次查找,发现第四天有事情做了,所以推到第三天,同理下一个推到第二天,还剩下的两个deadline为2的,发现第一天和第二天都有事情做了,所以只能扣分了,最后把这样的和输出就可以了。

 

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

using namespace std;

typedef struct Node {
    int day;
    int score;
}Node;
Node node[2011];
int flag[201111];
int ans[2011];

int cmp(Node a, Node b) {
    if(a.score == b.score) {
        return a.day < b.day;
    }
    return a.score > b.score;
}

int main() {
    int t, n;
    int i, j, k;
    int aindex;
    __int64 res;
    scanf("%d", &t);
    for(k = 0; k < t; k++) {
        memset(ans, 0, sizeof(ans));
        memset(flag, 0, sizeof(flag));
        scanf("%d", &n);
        for(i = 0; i < n; i++) {
            scanf("%d", &node[i].day);
        }
        for(i = 0; i < n; i++) {
            scanf("%d", &node[i].score);
        }
        sort(node, node+n, cmp);
        aindex = 0;
        for(i = 0; i < n; i++) {
            int index = node[i].day;
            if(flag[index] == 1) {
                for(j = index; j >= 1; j--) {
                    if(flag[j] == 0) {
                        flag[j] = 1;
                        break;
                    }
                }
                if(j == 0) {
                    ans[aindex++] = node[i].score;
                }
            }
            else {
                flag[index] = 1;
            }
        }
        res = 0;
        for(i = 0; i < aindex; i++) {
            res += ans[i];
        }
        printf("%I64d\n", res);
    }
    return 0;
}


 

你可能感兴趣的:(HDU 1789)