题目链接:http://codeforces.com/contest/807/problem/D
题意:对于动态计分的 Codeforces Round ,已知每题的 score 是根据 Round 参加人数和该题过题人数计算,两者之比结合上图得出该题的分数。某人在该题的得分为 score*(1−t/250) 其中 t 表示通过该题的时间。
已知参加该场比赛的所有参加者的过题情况(包括 Vasya 和 Petya),问如何通过增加新的参赛者(尽量少),使得 Vasya 的最终得分高于 Petya。
题解:首先预算一下最多需要多少人,3000*4/12=10000,最多不超过10000人。
然后就枚举一遍0~10000,需要注意的是几种情况
if(T[1].a[j] == -1) {
rate[j] = 1.0 * sum[j] / (n + i);
}
else {
if(T[1].a[j] > T[2].a[j] && T[2].a[j] != -1) {
rate[j] = 1.0 * (sum[j] + i) / (n + i);
}
else {
rate[j] = 1.0 * sum[j] / (n + i);
}
}
这些情况考虑了就行了。
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #define inf 0X3f3f3f3f using namespace std; struct TnT { int a[6]; }T[200]; int main() { int n; double rate[6]; int sum[6]; memset(sum , 0 , sizeof(sum)); scanf("%d" , &n); for(int i = 1 ; i <= n ; i++) { for(int j = 1 ; j <= 5 ; j++) { scanf("%d" , &T[i].a[j]); if(T[i].a[j] >= 0) { sum[j]++; } } } int flag = 0; for(int i = 1 ; i <= 5 ; i++) { if(T[2].a[i] > T[1].a[i] || (T[2].a[i] == -1 && T[1].a[i] != -1)) { flag = 1; break; } } if(!flag) { printf("-1 "); } else { int ans = -1; for(int i = 0 ; i <= 10000 ; i++) { double sum1 = 0 , sum2 = 0; for(int j = 1 ; j <= 5 ; j++) { if(T[1].a[j] == -1) { rate[j] = 1.0 * sum[j] / (n + i); } else { if(T[1].a[j] > T[2].a[j] && T[2].a[j] != -1) { rate[j] = 1.0 * (sum[j] + i) / (n + i); } else { rate[j] = 1.0 * sum[j] / (n + i); } } } for(int j = 1 ; j <= 5 ; j++) { if(rate[j] <= 1.0 && rate[j] > 1.0 / 2) { if(T[1].a[j] >= 0) sum1 += 1.0 * 500 * (1.0 - 1.0 * T[1].a[j] / 250); if(T[2].a[j] >= 0) sum2 += 1.0 * 500 * (1.0 - 1.0 * T[2].a[j] / 250); } if(rate[j] <= 1.0 / 2 && rate[j] > 1.0 / 4) { if(T[1].a[j] >= 0) sum1 += 1.0 * 1000 * (1.0 - 1.0 * T[1].a[j] / 250); if(T[2].a[j] >= 0) sum2 += 1.0 * 1000 * (1.0 - 1.0 * T[2].a[j] / 250); } if(rate[j] <= 1.0 / 4 && rate[j] > 1.0 / 8) { if(T[1].a[j] >= 0) sum1 += 1.0 * 1500 * (1.0 - 1.0 * T[1].a[j] / 250); if(T[2].a[j] >= 0) sum2 += 1.0 * 1500 * (1.0 - 1.0 * T[2].a[j] / 250); } if(rate[j] <= 1.0 / 8 && rate[j] > 1.0 / 16) { if(T[1].a[j] >= 0) sum1 += 1.0 * 2000 * (1.0 - 1.0 * T[1].a[j] / 250); if(T[2].a[j] >= 0) sum2 += 1.0 * 2000 * (1.0 - 1.0 * T[2].a[j] / 250); } if(rate[j] <= 1.0 / 16 && rate[j] > 1.0 / 32) { if(T[1].a[j] >= 0) sum1 += 1.0 * 2500 * (1.0 - 1.0 * T[1].a[j] / 250); if(T[2].a[j] >= 0) sum2 += 1.0 * 2500 * (1.0 - 1.0 * T[2].a[j] / 250); } if(rate[j] <= 1.0 / 32 && rate[j] > 0.0) { if(T[1].a[j] >= 0) sum1 += 1.0 * 3000 * (1.0 - 1.0 * T[1].a[j] / 250); if(T[2].a[j] >= 0) sum2 += 1.0 * 3000 * (1.0 - 1.0 * T[2].a[j] / 250); } } if(sum1 > sum2) { ans = i; break; } } printf("%d " , ans); } return 0; }