HDU 1789

来源:互联网 发布:剑灵金正恩捏脸数据 编辑:程序博客网 时间:2024/06/05 22:53

主要是一个思路:

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

例如有这样一组数据

1 2 2 4 4 45 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;}


 

原创粉丝点击