第一题:n个人,每个人有一个对应的技能值s,现在要从n个人中选出p个人,使得他们的技能值相同。
显然,如果存在p个人的技能值是相同的,输出0就可以了。如果不存在,就要找出p个人,对他们进行训练,治他们的技能值相同。
训练一个小时,技能值增加1,只有一个教练,也就是只能同时训练一个 人。找出最佳的p个人的方案,输出最小的训练时间。
AC的代码:
#include <stdio.h> #include <stdlib.h> #include <algorithm> using namespace std; int s[100010]; // skill score long long int t[100010]; int e[100010]; int main() { int tg; scanf("%d", &tg); int n, p; int ca=1; while(tg--) { scanf("%d %d", &n, &p); s[0] = 0; for(int i=1; i<=n; i++) { scanf("%d", &s[i]); } sort(s+1, s+n+1); t[0] = 0; for(int i=1; i<=n; i++) { t[i] = t[i-1] + s[i]; } for(int i=p; i<=n; i++) { e[i] = t[i] - t[i-p]; } int ans = s[p]*p - e[p]; int cur; for(int i=p; i<=n; i++) { cur = s[i]*p - e[i]; if(cur < ans) ans = cur; } printf("Case #%d: %d\n", ca, ans); ca++; } return 0; }