codeforces 807 D. Dynamic Problem Scoring(贪心+思维)
题目链接: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);
}
}
这些情况考虑了就行了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #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\n" ); } 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\n" , ans); } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步