【题目描述】
老师在开学第一天就把所有作业都布置了,每个作业如果在规定的时间内交上来的话才有学分。每个作业的截止日期和学分可能是不同的。例如如果一个作业学分为10,要求在6天内交,那么要想拿到这10学分,就必须在第6天结束前交。
每个作业的完成时间都是只有一天。例如,假设有7次作业的学分和完成时间如下:
作业号
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
期限
|
1
|
1
|
3
|
3
|
2
|
2
|
6
|
学分
|
6
|
7
|
2
|
1
|
4
|
5
|
1
|
最多可以获得15学分,其中一个完成作业的次序为2,6,3,1,7,5,4,注意可能d还有其他方法。
你的任务就是找到一个完成作业的顺序获得最大学分。
【输入】
第一行一个整数N,表示作业的数量。
接下来N行,每行包括两个整数,第一个整数表示作业的完成期限,第二个数表示该作业的学分。
【输出】
输出一个整数表示可以获得的最大学分。保证答案不超过longint范围。
【输入样例】
7 1 6 1 7 3 2 3 1 2 4 2 5 6 1
【输出样例】
15
这道题和ybt上的1426 智力大冲浪 比较相像,一开始我就是直接用1426的代码做的,上代码——
![]()
1 #include<bits/stdc++.h>
2 using namespace std;
3 int n;
4 int k,m,p,w,ans,l,s;
5 bool u[1000001];
6 struct node{
7 int a,b;
8 bool operator <(const node &y)const
9 {
10 return b>y.b;
11 }
12 }x[1000001];
13 int read()
14 {
15 int f=1;char ch;
16 while((ch=getchar())<'0'||ch>'9')
17 if(ch=='-')f=-1;
18 int res=ch-'0';
19 while((ch=getchar())>='0'&&ch<='9')
20 res=res*10+ch-'0';
21 return res*f;
22 }
23 void write(int x)
24 {
25 if(x<0)
26 {
27 putchar('-');
28 x=-x;
29 }
30 if(x>9)write(x/10);
31 putchar(x%10+'0');
32 }
33 int main()
34 {
35 n=read();
36 for(int i=1;i<=n;i++)
37 {
38 x[i].a=read(),x[i].b=read();
39 s+=x[i].b;
40 }
41 sort(x+1,x+1+n);
42 for(int i=1;i<=n;i++)
43 {
44 int flag=0;
45 for(int j=x[i].a;j>=1;j--)
46 if(!u[j])
47 {
48 u[j]=true;
49 flag=1;
50 break;
51 }
52 if(!flag)
53 {
54 for(int j=n;j>=1;j--)
55 if(!u[j])
56 {
57 u[j]=1;
58 break;
59 }
60 s-=x[i].b;
61 }
62 }
63 write(s);
64 return 0;
65 }
View Code