codeforces 412div.2

点击题号进入题面

---------

新笔记本终于到了,可以愉快的写代码了..

------

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 }
View Code

------

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 }
View Code

-------

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 }
View Code
原文地址:https://www.cnblogs.com/nervendnig/p/8427289.html