A | CodeForces 807A | Is it rated? | ||
B | CodeForces 807B | T-Shirt Hunt | ||
C | CodeForces 807C | Success Rate | ||
D | CodeForces 807D | Dynamic Problem Scoring | ||
E | CodeForces 807E | Prairie Partition |
点击题号进入题面
---------
新笔记本终于到了,可以愉快的写代码了..
------
A 807A
题意:
给一个codeforces比赛的final standing和比赛前后的rating值,保证不存在一样的rating,
问你是否能知道本场比赛是否计分,如果不能判断则输出maybe
分析:
遍历即可
有人变化直接输出rated,无人变化如果不是顺序则unrated,否则maybe
1 /********************** 2 *@Name: 3 * 4 *@Author: Nervending 5 *@Describtion: 6 *@DateTime: 2018-02-04 03:39:20 7 ***********************/ 8 #include <bits/stdc++.h> 9 using namespace std; 10 const int maxn=1e5+10; 11 const int INF=0x3f3f3f3f; 12 int n; 13 int a[maxn]; 14 int b[maxn]; 15 int c[maxn]; 16 int cmp(int a,int b){ 17 return a>b; 18 } 19 int main(){ 20 //#define test 21 #ifdef test 22 freopen("in.txt","r",stdin); 23 freopen("out.txt","w",stdout); 24 #endif 25 cin>>n; 26 for(int i=0;i<n;i++){ 27 cin>>a[i]>>b[i]; 28 c[i]=a[i]; 29 } 30 sort(c,c+n,cmp); 31 for(int i=0;i<n;i++){ 32 if(a[i]!=b[i]){ 33 cout<<"rated"; 34 return 0; 35 } 36 } 37 for(int i=1;i<n;i++){ 38 if(a[i]>a[i-1]){ 39 cout<<"unrated"; 40 return 0; 41 } 42 } 43 cout<<"maybe"; 44 45 #ifdef test 46 fclose(stdin); 47 fclose(stdout); 48 system("out.txt"); 49 #endif 50 return 0; 51 }
------
B 807B
题意:
在一场CF比赛中,需要至少达到y分,当前以及获得足够的x分,x>=y
除此之外,为了获得奖品,你需要改变自己的分数使得当前分数x经过下列伪代码获得的名次值中存在你的当前名次a
通过hack的成功和失败可以改变自己的分数x,成功加100失败减50
求最小的成功次数,输入保证有解
i := (s div 50) mod 475
repeat 25 times:
i := (i * 96 + 42) mod 475
print (26 + i)
分析:
枚举即可
先尝试只失败不成功
然后尝试成功,每次测试也尝试额外失败一次的情况
1 /********************** 2 *@Name: 3 * 4 *@Author: Nervending 5 *@Describtion: 6 *@DateTime: 06/02/18 22:05 7 ***********************/ 8 #include <bits/stdc++.h> 9 using namespace std; 10 const int maxn=1e5+10; 11 const int maxm=1e6+10; 12 const int INF=0x3f3f3f3f; 13 #define show(x) cout<<#x<<"="<<x<< endl 14 int a,x,y; 15 int check(int s){ 16 int na=(s/50)%475; 17 for(int i=0;i<25;i++){ 18 na=(na*96+42)%475; 19 if(a==na+26)return true; 20 } 21 return false; 22 } 23 24 int main() { 25 //#define test 26 #ifdef test 27 freopen("in.txt","r",stdin); 28 freopen("out.txt","w",stdout); 29 #endif 30 cin>>a>>x>>y; 31 for(int i=x;i>=y;i-=50){ 32 if(check(i)){ 33 cout<<0; 34 return 0; 35 } 36 } 37 for(int i=x+100,j=1;;j++,i+=100){ 38 if(check(i)||check(i-50)){ 39 cout<<j; 40 return 0; 41 } 42 } 43 44 45 #ifdef test 46 fclose(stdin); 47 fclose(stdout); 48 system("out.txt"); 49 #endif 50 return 0; 51 }
-------
C 807C
题意;
你当前的成功次数是x,总次数是y,你希望比值达到a/b,求最小的尝试次数,不存在输出-1
分析:
可以发现,只需要总次数达到b的整数倍即可,最小的合法倍数必然为解
成功次数只要为正值且小于总次数即可
二分枚举倍数即可以获得答案
注意是可能不存在解的,比如a==b而x!=y,或者a==0而x!=0,可以预先剪枝
1 /********************** 2 *@Name: 3 * 4 *@Author: Nervending 5 *@Describtion: 6 *@DateTime: 7 ***********************/ 8 #include <bits/stdc++.h> 9 #define show(x) cout<<#x<<"="<<x<<endl 10 using namespace std; 11 const int maxn=1e5+10; 12 const int maxm=1e6+10; 13 const int INF=0x3f3f3f3f; 14 typedef long long ll; 15 typedef unsigned long long ull; 16 inline long long gcd(long long a,long long b){while(b)b=(a%b)+(a=b)-b;return a;} 17 inline long long lcm(long long a,long long b){return a*b/gcd(a,b);} 18 ll casn,n,m,k; 19 ll a,b,x,y; 20 21 int main(){ 22 //#define test 23 #ifdef test 24 freopen("in.txt","r",stdin); 25 freopen("out.txt","w",stdout); 26 #endif 27 28 cin>>casn; 29 while(casn--){ 30 cin>>x>>y>>a>>b; 31 if((a==b&&x!=y)||(a==0&&x!=0)){ 32 cout<<-1<<endl; 33 continue; 34 } 35 ll ans=-1; 36 ll l=0,r=1e10; 37 while(l<=r){ 38 ll mid=(l+r)>>1; 39 ll ac=mid*a; 40 ll at=mid*b; 41 if(ac>=x&&at>=y&&ac-x<=at-y){ 42 ans=at-y; 43 r=mid-1; 44 }else { 45 l=mid+1; 46 } 47 } 48 if(ans==-1)cout<<-1<<endl; 49 else cout<<ans<<endl; 50 } 51 52 #ifdef test 53 fclose(stdin); 54 fclose(stdout); 55 system("out.txt"); 56 #endif 57 return 0; 58 }