「1.1」家庭作业
问题背景
「一本通1.1 练习4」
题目描述
老师在开学第一天就把所有作业都布置了,每个作业如果在规定的时间内交上来的话才有学分。每个作业的截止日期和学分可能是不同的。例如如果一个作业学分为 10,要求在 6 天内交,那么要想拿到这 10 学分,就必须在第 6 天结束前交。
每个作业的完成时间都是只有一天。例如,假设有 7 次作业的学分和完成时间如下:
作业号 期限 学分
1 1 6
2 1 7
3 3 2
4 3 1
5 2 4
6 2 5
7 6 1
最多可以获得 15 学分,其中一个完成作业的次序为 2,6,3,1,7,5,4,注意可能还有其他方法。
你的任务就是找到一个完成作业的顺序获得最大学分。
输入格式
第一行一个整数 N,表示作业的数量;
接下来 N 行,每行包括两个整数,第一个整数表示作业的完成期限,第二个数表示该作业的学分。
输出格式
输出一个整数表示可以获得的最大学分。保证答案不超过 C/C++ 的 int 范围。
样例输入1
7
1 6
1 7
3 2
3 1
2 4
2 5
6 1
样例输出1
15
注释说明
提示:使用读优化!
对于20%的数据,N≤10^3
对于40%的数据,N≤10^4
对于60%的数据,N≤10^5
对于100%的数据,N≤10^6,作业的完成期限均小于 7×10^5。
#include<bits/stdc++.h>
using namespace std;
int x,n,ans;
bool d[700002];
struct ed{
int q,f;
}a[1000005];
bool cmp(ed x,ed y){
return x.f>y.f;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].q,&a[i].f);
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
for(int j=a[i].q;j>=1;j--){
if(!d[j]){
d[j]=1;
ans+=a[i].f;
break;printf("%d\n",i);
}
}
}
cout<<ans;
}