Super.Y最近很伤心,因为他的好球友一鸣受伤了,这样就没人陪Super.Y打球了。所以Super.Y只能自己去练投篮了。
场地上有N个篮筐,球投进第i个篮筐可以得到Di分且投进后这个篮筐就消失了,神奇的是,第i个篮筐会在第Ti秒末消失。(即要么被投消失,要么在Ti秒末消失)
Super.Y的命中率为100%,他一秒中可以投进一个球,他想知道他最多能得到多少分.
P.S:以此祝愿一鸣早日康复
Input Format
一行,两个空格隔开的整数A,B。
Output Format
第1行:N
第2~N+1行 Di Ti
Sample Input
3
1 2
2 2
3 1
Sample Output
5
Limits
60% 1<=N <=1000
100% 1<=N<=100000,1<=Di,Ti<=10000
=============================================
题解正文
=============================================
题目分析
这题情景很搞笑(师兄真幽默 哈哈哈),我们只要知道一下信息即可解题:
篮筐有N个,不同的篮筐有不同的分值d(这个变量我乱起的),分别在t时消失。
这位优秀的师兄投篮很准,意味着我们每一秒选一个篮筐来得分就好。
由于篮筐分值和时间的不同,我们需要进行一定的取舍才能得到最优的答案。
解决方法
为了尽快解决问题,我没有细细考虑更高效的算法,实际上应该有更快的,这个就留给大家(包括我)思考吧~
首先我们得知道我们要尽可能得高分,所以要尽可能地选高分篮筐,但是,我们不能忘记篮筐会消失!因此为了使每一时刻需要选择的篮筐少些,我们按时间倒序进行选择。(也就是说我们在输入时记录消失时间最迟的篮筐,从那个时间开始向t = 1s时循环)
在当前时间,我们从【能选择的篮筐】中选择分数最高的,因此我们需要将篮筐排个序,按分数从高到低排,这要便于每次选取高分,减少遍历数量(不过最坏情况还是没有改善)
用结构体存篮筐是个不错的选择。
下面就是代码啦
#include <iostream> #include <algorithm> using namespace std; struct busket{int d, t; bool ed;};//ed用来表示该篮筐是否已经投过 int n,maxx(0),ans(0); busket *shot; inline bool cmp(busket a, busket b) { if(a.d != b.d)return a.d > b.d; else return a.t > b.t; } void init() { cin >> n; shot = new busket[n]; for(int i = 0; i < n; ++i) { cin >> shot[i].d >> shot[i].t; maxx = max(maxx, shot[i].t); shot[i].ed = 0; } sort(shot,shot+n,cmp); } int main() { init(); for(int i = maxx ; i >= 1; --i) { for(int j = 0; j < n; ++j) { if(!shot[j].ed && shot[j].t >= i) { ans += shot[j].d; shot[j].ed = 1; break; } } } cout<<ans; }