SJTU OJ 1128 神奇的篮筐 题解

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


=============================================

题解正文

=============================================


  1. 题目分析

    这题情景很搞笑(师兄真幽默 哈哈哈),我们只要知道一下信息即可解题:

    1. 篮筐有N个,不同的篮筐有不同的分值d(这个变量我乱起的),分别在t时消失。

    2. 这位优秀的师兄投篮很准,意味着我们每一秒选一个篮筐来得分就好。

    3. 由于篮筐分值和时间的不同,我们需要进行一定的取舍才能得到最优的答案。

  2. 解决方法

    为了尽快解决问题,我没有细细考虑更高效的算法,实际上应该有更快的,这个就留给大家(包括我)思考吧~

    1. 首先我们得知道我们要尽可能得高分,所以要尽可能地选高分篮筐,但是,我们不能忘记篮筐会消失!因此为了使每一时刻需要选择的篮筐少些,我们按时间倒序进行选择。(也就是说我们在输入时记录消失时间最迟的篮筐,从那个时间开始向t = 1s时循环)

    2. 在当前时间,我们从【能选择的篮筐】中选择分数最高的,因此我们需要将篮筐排个序,按分数从高到低排,这要便于每次选取高分,减少遍历数量(不过最坏情况还是没有改善)

    3. 用结构体存篮筐是个不错的选择。

  3. 下面就是代码啦

  4. #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;
    }

转载于:https://my.oschina.net/xueyang/blog/288227

SJTU OJ是上海交通大学在线评测系统的简称。它是一个提供给学生练习编程和解决问题的平台。 首先,学生需要注册并登录SJTO OJ系统。系统会为每个注册用户分配一个唯一的用户ID和密码,以保证账户安全。 上机编程练习是SJTO OJ的主要功能之一。学生可以在系统中选择不同的编程题目,例如算法题、数据结构题、数学题等等。每道题目都附带了详细的题目描述和输入输出样例。学生需要根据题目要求,编写相应的程序,并在系统中提交代码。系统会自动编译和运行学生提交的代码,并对其进行评测。评测结果包括通过样例的数量、程序运行时间、内存占用等信息。 除了上机编程练习,SJTO OJ还提供了一些其他功能。例如,学生可以查看自己的解题记录和成绩,统计自己的编程能力和进步情况。他们可以参加在线比赛,与其他学生一同竞争,提高自己的编程水平。 作为一名学生,使用SJTO OJ可以有效地提升自己的编程技能和解决问题的能力。通过参与编程练习和比赛,学生可以不断学习新知识,发现并改进自己的不足之处。此外,SJTO OJ还为学生提供了一个交流的平台,他们可以与其他学生分享自己的解题思路和经验。 总之,SJTO OJ是一个非常有用的在线评测系统,通过使用它,学生可以提高自己的编程能力,并享受与其他同学交流和竞争的乐趣。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值