codeforces D. Dynamic Problem Scoring

来源:互联网 发布:怎么拍下淘宝里的货 编辑:程序博客网 时间:2024/05/24 05:20

题意:

给出n个人5道题的codeforces提交时间,现在第一个人想要自己的成绩总和大于第二
个人,怎么强行提高自己成绩呢?他会开小号去提交某一些题目,而一道题的
Accepted之后的成绩是根据比例计算的,Accepted / 总提交。比例越小成绩越高
如题中的表。他可以在自己能力范围内控制题目的比例。求出,他需要多少个小号
去达到目的。

思路:

对于第一个人,如果某一个题目时间第二个人的早,那么就要尽量发挥自己的优势
如果晚的话,就让题目的比例尽量高。(注意-1的情况不得分)。

#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int maxn = 1005;int n;int v[maxn][10];int num[5];int solve(int x,int flag,int y){    if(v[flag][y] == -1)        return 0;    int tmp;    if(v[0][y] == -1 || v[1][y] == -1 || v[0][y] < v[1][y]) tmp = num[y];    else tmp = x - n + num[y];    int ans = 500;    for(int i = 2;i <= 32; i *= 2) {        if(tmp*i > x) break;        else            ans += 500;    }    return ans*(1.0-v[flag][y]/250.0);}int main(){    //freopen("in.txt","r",stdin);    scanf("%d",&n);    for(int i = 0;i < n; i++) {        for(int j = 0;j < 5; j++) {            scanf("%d",&v[i][j]);            if(v[i][j] != -1)                num[j]++;        }    }    int M = 100005+n;    int i;    for(i = n;i < M; i++) {        int V = 0,P = 0;        for(int j = 0;j < 5; j++) {            V += solve(i,false,j);        }        for(int j = 0;j < 5; j++) {            P += solve(i,true,j);        }        if(V > P) {            printf("%d\n",i-n);            return 0;        }    }    printf("-1\n");    return 0;}