本文共 1461 字,大约阅读时间需要 4 分钟。
题意:两个人比赛,得分规则如下:
每个题目的分值如下,
其中的分数代表,解决这道题目的人数占总比赛人数的比例;
每个人可以得的分数如下: 题目分值*(1-此人解决这道题目所用时间/250);
在比赛的所有的人当中有两个人,其中一个人的编号为0,名字为Vasya,另一个编号为1 ,名字为Petya,现在vasya想得到比petya高的分数,他申请了很多个账号来交题,他可以用申请的账号来交他做出来的题目,他没有做出来的题目不能交,现在给出n个人,其中包括vasya和petya,给出每个人解决题目所用的时间,其中一共有5道题目,现在问patya最少需要申请多少个账号可以得到比petya的分数高,如果vasya的分数不能比petya的高输出-1,否则输出所申请的账号数量。
思路:枚举+贪心
枚举:先统计现在每个题目过题的人数,然后在求进入下一档次时所有人的人数。因为每个题目的分值相当于是一个区间,每个分值有一个区间,所以枚举每个题目进入下一个档次所有人的数量。
贪心:为了让vasya的分数比petya的分数高并且需要申请账号的数量进可能的少,有如下贪心策略
代码如下
#include#include #include #include #include #include using namespace std;int per[200][5];int num[5];int n;int getscore(int idx,bool is,int nn){ if(per[is][idx]==-1) return 0; int solved=0; if(per[0][idx]==-1||per[1][idx]==-1||per[0][idx]<=per[1][idx]) { solved=num[idx]; } else { solved=nn-n+num[idx]; } int maxn=500; for(int i=2; i<=32; i*=2) { if(solved*i>nn) break; else maxn+=500; } return maxn*(1.0-per[is][idx]/250.0);}int main(){ scanf("%d",&n); memset(num,0,sizeof(num)); memset(per,0,sizeof(per)); for(int i=0; i
转载地址:http://gygsi.baihongyu.com/