2021/1/23rating赛解题+补题报告

A - A

题意:Borya需要按1,2,3.....n的顺序依次拜访医生,第i个医生只在第si , si+di , si+2*di ..... 天工作,且Borya每天只能看一位医生,求他拜访完所有的医生的最小天数

题解:按顺序来拜访,把医生的工作时间看成公差为di首项为si的等差数列,假设现在是第now天,可分为两种情况

  1.now<s,那么在第s天就可以访问,把now变成s  2.now<=s,循环使now不断+d,直到now>s (第一遍脑子不清醒把now=s归到第一类,WA了一次)

  因为要按顺序访问所以从第一位医生开始判断,输出最后的now

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
#define MAXN 1000
int main(){
    int sum=0,n,s,d,now=0;
    cin>>n;
    while(n--){
        cin>>s>>d;
        if(s<=now){
            while(s<=now){
                s+=d;
            }
            now=s;
        }else if(s>now){
            now=s;
        }
    }
    cout<<now<<endl;
    return 0;
} 
View Code

B - B

 题意:n个人排成队列能量分别为a1,a2,.....an;依次比较队首的两个人的力量,力量大的胜出。获胜者留下,失败者移到队尾。当一个人连续赢了k次后游戏结束,求谁是赢家,输出赢家的力量。

 题解:依次求ai大于aj的数sum,如果sum>=k,输出 ai;如果没有找到输出最大值(k需要用long long,除了第一场cnt从零开始算其他都从1开始)

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
#define MAXN 550
int a[MAXN];
int main(){
    int n;
    long long k,sum=0;
    int maxx=-1;
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i]; 
        maxx=max(a[i],maxx);
    } 
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if(a[j]<a[i]){
                sum++;
            }else{
                break;
            }
            if(sum>=k){
                cout<<a[i]<<endl;
                return 0;
            }
        }
        sum=1;
    }
    cout<<maxx<<endl;
    return 0;
} 
View Code

C - C

 题意:有n行命令,每行包括一个操作和一个整数。这些操作包括AND,OR,XOR(&,|,^)简化操作,使其在五步内且结果不变。

 题解:1.  0&0=0, 0&1=0, 1&1=1,1&0=0;两位同时为1时结果为1

    2.  0|0=0,  0|1=1, 1|1=1, 1|0=0;有一个为1 时结果为1;

    3.  0^0=0, 0^1=1, 1^1=0,   1^0=1;同为0, 异为1

  取a=0,b=1023,将n次位运算操作后的a,b值,对比即可得到每一位数字进行的操作。

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<set>
using namespace std;
int main(){
    int n,i,x,a=0,b=1023;
    int AND=0,OR=0,XOR=0;
    string op;
    cin>>n;
    while(n--){
        cin>>op>>x;
        if(op[0]=='&'){
            a=a&x;
            b=b&x;
        }else if(op[0]=='|'){
            a=a|x;
            b=b|x;
        }else if(op[0]=='^'){
            a=a^x;
            b=b^x;
        }
    }
    AND=a|b;
    OR=a&b;
    XOR=a&(b^1023);
    cout<<3<<endl;
    cout<<"& "<<AND<<endl;
    cout<<"| "<<OR<<endl;
    cout<<"^ "<<XOR<<endl;
    return 0;
}
View Code

 

posted @ 2021-01-29 22:26  Endeavo_r  阅读(46)  评论(0)    收藏  举报