NOJ 1447 大作业

来源:互联网 发布:钩针和棒针的区别知乎 编辑:程序博客网 时间:2024/06/05 15:41


大作业

                                  时间限制(普通/Java):1000MS/3000MS         运行内存限制:65536KByte
                                                          总提交:79          测试通过:29

题目描述

由于之前宅得太深,到了期末了,嘉娃还有N个大作业没有写。以嘉娃的速度,他每天能且只能完成一个大作业。但是这N门大作业都有一个截止时间,如果超过这个时间再提交的话将会没有分数。现在,嘉娃要在N天内完成N门大作业,他给了你一份有N个大作业的截止时间和分数的列表,你能帮嘉娃算出他最多能得到多少分吗? 



输入

第一行一个整数N(0N1000),表示大作业的数目。接下来N行,每行两个整数。di(1diN)表示第i个大作业的截止时间,以嘉娃开始做大作业开始算;pi(1pi500)表示第i个大作业的分数。 

输出

输出一个整数,表示嘉娃能得到的最多的分数。之后加一个换行。

样例输入

5
3 500 
2 100 
2 250 
1 290 
5 200

样例输出

1240

题目来源

第8届南京大学 ACM 程序设计大赛


题目链接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1447


题目分析:同POJ 1456,数据还比POJ弱,不多说了,这里的I题  http://blog.csdn.net/tc_to_top/article/details/43150505


#include <cstdio>#include <algorithm>using namespace std;int const MAX = 1005;int fa[MAX];struct HW{    int t, s;}hw[MAX];int cmp(HW a, HW b){    return a.s > b.s;}void UF_set(){    for(int i = 0; i <= MAX; i++)        fa[i] = i;}int Find(int x){    return x == fa[x] ? x : fa[x] = Find(fa[x]);}void Union(int a, int b){    int r1 = Find(a);    int r2 = Find(b);    if(r1 != r2)        fa[r1] = r2;}int main(){    int n, sum = 0;    UF_set();    scanf("%d", &n);    for(int i = 0; i < n; i++)        scanf("%d %d", &hw[i].t, &hw[i].s);    sort(hw, hw + n, cmp);    for(int i = 0; i < n; i++)    {        int d = Find(hw[i].t);        if(d)        {            sum += hw[i].s;            Union(d, d - 1);        }    }    printf("%d\n", sum);}


0 0