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; }
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; }
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; }