codeforces 807 D. Dynamic Problem Scoring(贪心+思维)

题目链接:http://codeforces.com/contest/807/problem/D

题意:对于动态计分的 Codeforces Round ,已知每题的 score 是根据 Round 参加人数和该题过题人数计算,两者之比结合上图得出该题的分数。某人在该题的得分为 score*(1t/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\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;
}
posted @ 2017-05-08 22:36  Gealo  阅读(290)  评论(0编辑  收藏  举报