小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);
}
}