大作业
时间限制(普通/Java) :1000MS/3000MS 运行内存限制:65536KByte总提交:79 测试通过:29
题目描述
由于之前宅得太深,到了期末了,嘉娃还有N个大作业没有写。以嘉娃的速度,他每天能且只能完成一个大作业。但是这N门大作业都有一个截止时间,如果超过这个时间再提交的话将会没有分数。现在,嘉娃要在N天内完成N门大作业,他给了你一份有N个大作业的截止时间和分数的列表,你能帮嘉娃算出他最多能得到多少分吗?
输入
第一行一个整数N(0≤ N≤ 1000),表示大作业的数目。接下来N 行,每行两个整数。di(1≤ di≤ N)表示第i 个大作业的截止时间,以嘉娃开始做大作业开始算;pi(1≤ pi≤ 500)表示第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);
}