线上笔试
美团3.19(第三题)
题目
代码
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = 110;
int a[N];
int s[N], n, k, m, p, q;
int main() {
cin >> n >> k >> m >> p >> q;
for (int i = 1; i <= k; i++) cin >> a[i];
sort(a + 1, a + 1 + k);
for (int i = k; i >= 1; i--) s[i] = s[i + 1] + a[i];
int pre = 0; int ans = 0;
for (int i = 0; i < k; i++) {
pre += n * a[i];
if (pre > m) {
pre -= n * a[i];
m -= pre;
ans = max(ans, (i - 1)*n*p + m / a[i] * p);
break;
}
int tmp = m - pre;
int res = p * i * n;
int nx = s[i + 1];
res += min(tmp / nx, n)* (k - i) * p + min(tmp / nx, n) * q;
int l = tmp / nx;
tmp %= nx;
for (int j = i + 1; j < k; j++) {
if (tmp >= a[j]&&l<n) res += p, tmp -= a[j];
}
ans = max(ans, res);
}
int t = min(m / s[1], n) * (k * p) + min(m / s[1], n) * q;
cout << max(ans, t) << '\n';
//system("pause");
return 0;
}
作为一名学校足球教练,你的任务是挑选一支由P个学生组成的团队代表你的学校。共有N名学生供你挑选,第 i 名学生的技术等级为Si,这是一个正整数,表示他们的技术水平。在你看来一个合理的团队中的P个球员的技术应该是相当的,这样才能使每个人都融入到队内。在最开始,你可能无法直接选出一个配置合理的队伍,因此你将为一些学生提供一对一的辅导。将一名学生的技术等级提高1需要你花费1个小时的时间来进行辅导。
比赛季很快就开始了(事实上,第一场比赛已经开始了!),所以你想知道训练出一个合理的团队,你需要提供的最少训练小时数是多少。
数据范围
1≤T≤100,
1≤Si≤10000,
2≤P≤N,
2≤N≤105
输入样例:
3
4 3
3 1 9 100
6 2
5 5 1 2 3 4
5 5
7 7 1 7 7
输出样例:
Case #1: 14
Case #2: 0
Case #3: 6
输入格式
第一行包含整数T,表示共有T组测试数据。
每组测试数据的第一行包含两个整数N和P。
第二行包含N个整数Si,其中第 i 个整数为第 i 个学生的技术等级。
输出格式
每组数据输出一个结果,每个结果占一行。
结果表示为“Case #x: y”,其中x为组别编号(从1开始),y为所需的最少训练小时数。
#include<iostream>
#include<algorithm>
#include<limits.h>
using namespace std;
const int N = 100010;
int main(){
int T;
cin >> T;
for(int i = 1; i <= T; i++){
int n, p, res = INT_MAX;
int s[N], sum[N];
sum[0] = 0;
cin >> n >> p;
for(int i = 1; i <= n; i++){
cin >> s[i];
}
sort(s+1, s+n+1);
for(int i = 1; i <= n; i++){
sum[i] = sum[i-1] + s[i];
}
for(int i = p; i <= n; i++){
res = min(res, p*s[i]-(sum[i]-sum[i-p]));
}
printf("Case #%d: %d\n", i, res);
}
return 0;
}