2016 网易校招贪心题解答

小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

输出描述:

一行输出答案。

示例1

输入

5 10 9
0 5
9 1
8 1
0 1
9 100

输出

43

 

贪心的思想在校招笔试题中非常常见,这里排序的时候使用C++ pair这种数据结构比较简洁,注意这里的答案要用long long来存,有可能出现越界

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
pair<int, int> score[N];    // first为提高1分要花的时间,second为考试能获得的最高分
int main()
{
	int n, avg, r;
	while (scanf("%d %d %d", &n, &r, &avg) != EOF) {
		long long aim = avg * n;
		int performance, time;
		for (int i = 0; i < n; i++) {
			scanf("%d %d", &performance, &time);
			score[i].first = time;
			score[i].second = r - performance;
			aim = aim - performance;
		}
		//printf("%d\n", aim);
		sort(score, score + n);
		long long res = 0;
		for (int i = 0; i < n; i++) {
			//printf("%d %d\n", score[i].first, score[i].second);
			while (aim > 0 && score[i].second > 0) {
				res += score[i].first;
				score[i].second--;
				aim--;
			}
			if (aim == 0)
				break;
		}
		printf("%lld\n", res);
	}
}

一条长l的笔直的街道上有n个路灯,若这条街的起点为0,终点为l,第i个路灯坐标为ai ,每盏灯可以覆盖到的最远距离为d,为了照明需求,所有灯的灯光必须覆盖整条街,但是为了省电,要使这个d最小,请找到这个最小的d。

输入描述:

每组数据第一行两个整数n和l(n大于0小于等于1000,l小于等于1000000000大于0)。第二行有n个整数(均大于等于0小于等于l),为每盏灯的坐标,多个路灯可以在同一点。

输出描述:

输出答案,保留两位小数。

示例1

输入

7 15
15 5 3 7 9 14 0

输出

2.50

这是一道比较简单的模拟题,特别注意,这个答案是两点之间最短距离的一半,C++特别注意整形和浮点的问题

  

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1500;

int main()
{
	int n, l;
	while (cin >> n >> l) {
		int arr[N];
		for (int i = 0; i < n; i++)
			scanf("%d", &arr[i]);
		sort(arr, arr + n);
		double maxD = 0;
		for (int i = 1; i < n; i++) {
			if (1.0*(arr[i] - arr[i - 1]) / 2 > maxD)
				maxD = 1.0*(arr[i] - arr[i - 1]) / 2;
		}
		if (1.0*arr[0] > maxD)
			maxD = 1.0*arr[0];

		if (1.0*(l - arr[n - 1]) > maxD)
			maxD = 1.0*(l - arr[n - 1]);

		printf("%.2f\n", maxD);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值