网易2016软件工程师笔试题-----[编程题] 奖学金(C++实现)

题目描述:牛客网题目链接

小v今年有n门课,每门都有考试,为了拿到奖学金,小v必须让自己的平均成绩至少为avg。每门课由平时成绩和考试成绩组成,满分为r。现在他知道每门课的平时成绩为ai ,若想让这门课的考试成绩多拿一分的话,小v要花bi 的时间复习,不复习的话当然就是0分。同时我们显然可以发现复习得再多也不会拿到超过满分的分数。为了拿到奖学金,小v至少要花多少时间复习。

输入描述:
第一行三个整数n,r,avg(n大于等于1小于等于1e5,r大于等于1小于等于1e9,avg大于等于1小于等于1e6),接下来n行,每行两个整数ai和bi,均小于等于1e6大于等于1
输出描述:
一行输出答案。
输入例子:
5 10 9
0 5
9 1
8 1
0 1
9 100
输出例子:
43
分析:只需满足平均成绩大于等于avg即可,不管单科成绩。所以先从花时间最少的课开始复习,使其满分。

伪代码如下:

if(当前成绩 >= avg*n)
    cout << 0 << endl;
else{
    sort(时间花费);
    for(时间花费从小到大)
         if 当前课程满分后不能获得奖学金
             复习至满分,累加复习时间,然后复习下一门
        else if 当前课程满分后能获得奖学金
            所需时间 += (所需总分 - 当前分数)*在该课程上获得1分所需时间
            输出时间;
            退出循环。
}
根据伪代码可编写最终代码如下:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

struct score
{
	int ai;
	int bi;
};

bool cmp(score a,score b)
{
	return a.bi<b.bi;
}

int main()
{
	int n,r,avg;
	while(cin>>n>>r>>avg)
	{
		vector<score> vp;
		score tmp;
		for(int i = 0;i<n;++i)
		{
			cin>>tmp.ai>>tmp.bi;
			vp.push_back(tmp);
		}
		sort(vp.begin(),vp.end(),cmp);
		int target = n*avg;
		int sum = 0;
		long total = 0;
		for(int i = 0;i<vp.size();++i)
			sum+=vp[i].ai;
		if(sum>=target)
			total = 0;
		else
		{
			int pos = 0;
			while(sum<target&&pos<vp.size())
			{
				if((r - vp[pos].ai)<=(target-sum))
				{
					sum += (r - vp[pos].ai);
					total += vp[pos].bi*(r - vp[pos].ai);
				}
				else
				{
					total += vp[pos].bi*(target - sum);
					sum += (target - sum);
				}
				++pos;
			}
		}
		cout<<total<<endl;
	}

	system("pause");
	return 0;
}
注意事项:

1、需要自己构造类,同时自定义比较器;

2、在测试的时候,最后一组大数据结果提示没通过,因为total是int,不够保存,换为long即可AC。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值