A 按rank给出每个人的赛前分数和赛后分数 如果一个人打败了比他分数高的人 他的分数必然升高 问比赛rated吗 如果一个人的分数改变了肯定rate 如果全都没改的话 也可能是rated 这时候check分数是否递增
B 给出一个伪代码 用你的分数放进去可以生成25个rank 给出你的rank 你的现在分数x 你的最低分数y 问你hack(成功 +100 失败 - 50)成功最少多少次能够让自己的分数变化后放入这个伪代码生成的25个rank里面包含你的rank
先枚举只失败的 直到不能再失败
如果不行就枚举 成功次数 (每次都尝试失败一次)
C 你现在提交了b次 对了a次 你期望AC/SUBMIT比值是p/q 问最少提交多少次可以 或者确定不可以
让这个比值翻倍 二分翻的倍数并最小化 check 条件是 当b -> ans * q 可否实现 a -> p * ans
D 一场比赛有五道题 每道题的分数由一个通过人数和比赛总人数的比值决定 每个人在一道题上的分数由通过时间和题目总分决定 有n个人比赛 1想通过建小号的方式打败2 问最少建多少个或者确定不可以
可以看到比值最小是1/32 最大是1/2 并且n<=120 所以可以想到如果想并且有能力调控题目分数的话 需要建的小号不会太多 所以直接枚举check
需要注意的是 如果我想让A题多几个AC人数来刷低题目分数 这些人将被视为参赛者 会影响其余的题目的分数
没有看明白这个条件的我敲了一天的暴力搜索每题的总分。。打出一万个BUG。。可能已经是一条咸鱼了。。
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<map> #include<string> #include<vector> #include<queue> #include<iostream> using namespace std ; #define L long long #define pb push_back int n ; int a[130][10] ; int b[10] ; int m ; int fs[8] = {0,500,1000,1500,2000,2500,3000} ; int js[8] = {0,1,2,4,8,16,32} ; int zh(int x , int nn) { if(x * 32 <= nn) return 6 ; if(x * 16 <= nn) return 5 ; if(x * 8 <= nn) return 4 ; if(x * 4 <= nn) return 3 ; if(x * 2 <= nn) return 2 ; return 1 ; } int vol[10][10] ; int lv[20] ; int c[20] ; int d[20] ; int main () { cin >> n ; memset(b, 0 , sizeof(b)) ; for(int i = 1 ; i <= n ; i ++ ) { for(int j = 1 ; j <= 5 ; j ++ ) { cin >> a[i][j] ; if(a[i][j] != -1) { b[j] ++ ; } } } for(int ans = 0 ; ans <= 3200000 ; ans ++ ) { int df1 = 0 , df2 = 0 ; for(int i = 1 ; i <= 5 ; i ++ ) { d[i] = b[i] ; if(a[1][i] == -1) continue ; if(a[2][i] == -1) continue ; if(a[1][i] > a[2][i]) { d[i] = b[i] + ans ; } } for(int i = 1 ; i <= 5 ; i ++ ) { if(a[1][i] != -1) df1 += fs[zh(d[i] , n + ans)] / 250 * (250 - a[1][i]) ; if(a[2][i] != -1) df2 += fs[zh(d[i] , n + ans)] / 250 * (250 - a[2][i]) ; } if(df1 > df2) { printf("%d " , ans) ; return 0; } if(ans == 3200000) { printf("-1 ") ; } } }