作者:继续不插电的名单 | 来源:互联网 | 2023-10-16 08:55
题意:给出n个人5道题的codeforces提交时间,现在第一个人想要自己的成绩总和大于第二个人,怎么强行提高自己成绩呢?他会开小号去提交某一些题目,而一道题的Accepted之后
题意:
给出n个人5道题的codeforces提交时间,现在第一个人想要自己的成绩总和大于第二
个人,怎么强行提高自己成绩呢?他会开小号去提交某一些题目,而一道题的
Accepted之后的成绩是根据比例计算的,Accepted / 总提交。比例越小成绩越高
如题中的表。他可以在自己能力范围内控制题目的比例。求出,他需要多少个小号
去达到目的。
思路:
对于第一个人,如果某一个题目时间第二个人的早,那么就要尽量发挥自己的优势
如果晚的话,就让题目的比例尽量高。(注意-1的情况不得分)。
#include
#include
#include
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] 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 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 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;
}