codeforces 412 D Dynamic Problem Scoring

2024-01-12 23:58

本文主要是介绍codeforces 412 D Dynamic Problem Scoring,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:两个人比赛,得分规则如下:

          每个题目的分值如下,

         

           其中的分数代表,解决这道题目的人数占总比赛人数的比例;

          每个人可以得的分数如下: 题目分值*(1-此人解决这道题目所用时间/250);

在比赛的所有的人当中有两个人,其中一个人的编号为0,名字为Vasya,另一个编号为1 ,名字为Petya,现在vasya想得到比petya高的分数,他申请了很多个账号来交题,他可以用申请的账号来交他做出来的题目,他没有做出来的题目不能交,现在给出n个人,其中包括vasya和petya,给出每个人解决题目所用的时间,其中一共有5道题目,现在问patya最少需要申请多少个账号可以得到比petya的分数高,如果vasya的分数不能比petya的高输出-1,否则输出所申请的账号数量。

思路:枚举+贪心

           枚举:先统计现在每个题目过题的人数,然后在求进入下一档次时所有人的人数。因为每个题目的分值相当于是一个区间,每个分值有一个区间,所以枚举每个题目进入下一个档次所有人的数量。

         贪心:为了让vasya的分数比petya的分数高并且需要申请账号的数量进可能的少,有如下贪心策略

  •  当vasya没过这个题的时候,此时其他账号也不能过这个题,此时过了这个题目的人数等于原人数
  •  当vasya过了这个题并且petya没过这个题的时候,要让分数尽可能的高,所以此时过题的人数等于原人数
  • 当vasya题的时间比petya短时,要让这个题目的分数尽可能的高,所以此时过题人数等于原人数
  • 当vasya过题的时间比prtya高的时候,要让这个题目的分值尽可能的低,所以此时过题人数等于原过题人数加上现在又加上的人数  

   代码如下

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cstdio>
#include <vector>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<n; i++){for(int j=0; j<5; j++){scanf("%d",&per[i][j]);if(per[i][j]!=-1) num[j]++;}}vector<int> v;v.clear();v.push_back(n);for(int i=0; i<5; i++){for(int j=2; j<=32; j*=2)if(num[i]*j>=n) v.push_back(num[i]*j);}sort(v.begin(),v.end());for(int i=0; i<v.size(); i++){if(i&&v[i]==v[i-1]) continue;int score1=0,score2=0;for(int j=0; j<5; j++)score1+=getscore(j,false,v[i]);for(int j=0; j<5; j++)score2+=getscore(j,true,v[i]);if(score1>score2){cout<<v[i]-n<<endl;return 0;}}cout<<-1<<endl;return 0;
}




 

这篇关于codeforces 412 D Dynamic Problem Scoring的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/599593

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes 优势 1、构建了一个用于监督原始视频去噪的基准数据集。为了多次捕捉瞬间,我们手动为对象s创建运动。在高ISO模式下捕获每一时刻的噪声帧,并通过对多个噪声帧进行平均得到相应的干净帧。 2、有效的原始视频去噪网络(RViDeNet),通过探

Codeforces Round 971 (Div. 4) (A~G1)

A、B题太简单,不做解释 C 对于 x y 两个方向,每一个方向至少需要 x / k 向上取整的步数,取最大值。 由于 x 方向先移动,假如 x 方向需要的步数多于 y 方向的步数,那么最后 y 方向的那一步就不需要了,答案减 1 代码 #include <iostream>#include <algorithm>#include <vector>#include <string>

Codeforces#295(Div.2)A、B(模拟+BFS)

解题报告链接:点击打开链接 C. 题目链接:点击打开链接 解题思路: 对于给定的字符串,取出现次数最多的字母(可以同时有多个)。由这些字母组成长度为n的字符串,求有多少种组合。最后用数学知识即可。 完整代码: #include <algorithm>#include <iostream>#include <cstring>#include <climits>