A
难度: \textcolor{red}{入门}
本人 AC 用时: 4\text{mins}
分情况讨论:
- a\bmod10<b
直接加上 b-a\bmod10 即可 - a\bmod10=b
直接输出 0 。 - a\bmod10>b
加上 10-(a\bmod10-b) ,原式变为 (a+10-a\bmod10+b)\bmod10=b
核心代码:
if(a%10<b) cout<<b-a%10;
else if(a%10==b) cout<<0;
else cout<<10-(a%10-b);
B
难度: \textcolor{red}{入门} (个人认为小于 A)
本人 AC 用时: 2\text{mins}
还是分情况讨论:
- a\bmod2=b\bmod2 (在同一侧)
直接输出 (a-b)\div2-1 (它们的距离) - a\bmod2≠b\bmod2 (不在同一侧)
直接输出 a\div2+b\div2 ( [a,0]+[0,b] )
核心代码:
if(a%2==b%2) cout<<abs(a-b)/2-1;
else cout<<a/2+b/2;
C
难度: \textcolor{red}{入门} (个人认为小于 AB)
本人 AC 用时: 2\text{mins}
直接按照题意,用循环模拟即可。
核心代码:
for(int i=1;i<k;i++) x=(x*x+c)%10000;
D
开始上难度了
难度: \textcolor{red}{入门}
本人 AC 用时: 2\text{mins}
对于新手来说,直接使用数组模拟可能有些困难。所以可以先输出 \le 15 的数字,后输出 >15 的数字即可。
核心代码:
for(int i=1;i<=n;i++){
cin>>t[i];
if(t[i]<=15) cout<<t[i]<<" ";
}
for(int i=1;i<=n;i++) if(t[i]>15) cout<<t[i]<<" ";
大模拟,启动!
E
难度: \textcolor{orange}{普及-}
本人 AC 用时: 15\text{mins}
观察箭头,可以将它分为两部分。
- 矩形部分
主要难点:求出矩形的位置。
不难看出矩形上方的空白部分高为 (n-k)/2 其余部分就是矩形本身。
这个没什么好讲的,难点在三角形部分。 - 三角形部分
难点:求出三角形的高。
不难发现,三角形的高与底的一半加一刚好相等。所以三角形高的部分为 \dfrac{n+1}{2} 。
接下来,将三角形分为上下两部分解决,具体见代码。
核心代码:
int t=(n+1)/2;
for(int j=1;j<=m-t;j++){
if(i<=(n-k)/2||i>n-(n-k)/2) cout<<".";
else cout<<"#";
}
if(i<=(n+1)/2){
for(int j=1;j<=i;j++) cout<<"#";
for(int j=i+1;j<=t;j++) cout<<".";
}else{
for(int j=1;j<=n-i+1;j++) cout<<"#";
for(int j=n-i+2;j<=t;j++) cout<<".";
}
F
难度: \textcolor{red}{入门}
本人 AC 用时: 10\text{mins}
没有思路,直接模拟。
核心代码:
for(int i=1;i<=m;i++){
int res=0;
for(int j=1;j<=n;j++)res+=a[j][i];
if(maxx<=res) maxx=res,idx=i;
}
maxx=0;
for(int i=1;i<=n;i++) maxx=max(maxx,a[i][idx]);
for(int i=1;i<=n;i++) if(a[i][idx]==maxx) ans++;
G
难度: \textcolor{orange}{普及-}/\textcolor{yellow}{普及/提高-}
本人 AC 用时: 40\text{mins}
做到这里才是真正的开始。
思路:
分为三部分:
- 记录拍数
扫到(
标记一下。扫到)
清楚标记并增加 ans 。当未标记时,扫到L
或R
ans 自增。 - 化为数组
将)
视为 0 ,将(
视为 -1 ,L
视为 1 ,R
视为 3 ,L'
视为 2 ,R'
视为 4 。
判断一下下一个字符是否为'
即可,具体见代码:
for(int i=1;i<=len;i++){
if(s[i]=='L'||s[i]=='R'){
if(s[i+1]!='\''){
if(s[i]=='R') a[++size]=3;
else if(s[i]=='L') a[++size]=1;
}else{
if(s[i]=='R') a[++size]=4;
else if(s[i]=='L') a[++size]=2;
}
}
else if(s[i]==')') a[++size]=0;
else if(s[i]=='(') a[++size]=-1;
}
- 纪录连续次数
用同样的标记思路,分三种情况讨论:
a_i=0
a_i=-1
\text{other}
对于情况 1 ,记录 1,2,3,4 是否出现,若出现则自增,若为出现则归零,再判断最大次数并清除标记。
对于情况 2 ,做上标记。
对于情况 3 ,若在标记内,增加到情况 1 的记录中。否则出现则自增,未出现归零。
具体实现见代码:
for(int i=1;i<=size;i++){
if(a[i]==0){
f=0;
if(f2[1]==1) cnt[1]++;
else cnt[1]=0;
if(f2[2]==1) cnt[2]++;
else cnt[2]=0;
if(f2[3]==1) cnt[3]++;
else cnt[3]=0;
if(f2[4]==1) cnt[4]++;
else cnt[4]=0;
maxx[1]=max(maxx[1],cnt[1]);
maxx[2]=max(maxx[2],cnt[2]);
maxx[3]=max(maxx[3],cnt[3]);
maxx[4]=max(maxx[4],cnt[4]);
memset(f2,0,sizeof f2);
}else if(a[i]==-1){
f=1;
}else if(f==1){
f2[a[i]]=1;
}else{
if(a[i]==1) cnt[1]++;
else cnt[1]=0;
if(a[i]==2) cnt[2]++;
else cnt[2]=0;
if(a[i]==3) cnt[3]++;
else cnt[3]=0;
if(a[i]==4) cnt[4]++;
else cnt[4]=0;
maxx[a[i]]=max(maxx[a[i]],cnt[a[i]]);
}
}
核心代码:不放,自己实现。
H
难度: \textcolor{orange}{普及-}
本人 AC 用时: 20\text{mins}
直接按照题意模拟即可,注意细节。(大模拟,真没啥好讲的)
核心代码(调整部分):
size=0;
memset(c,0,sizeof c);
maxx=0,minn=LLONG_MAX;
for(int i=1;i<=m;i++){
res[i]=0;
for(int j=1;j<=n;j++){
res[i]+=a[j][i];
}
if(res[i]>maxx) maxx=res[i];
if(res[i]<minn) minn=res[i];
}
for(int i=1;i<=m;i++){
if(res[i]==maxx||res[i]==minn){
for(int j=1;j<=n;j++){
c[++size]=a[j][i];
a[j][i]=-1;
}
}
}
sort(c+1,c+size+1,cmp);
int cnt=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==-1) a[i][j]=c[++cnt];
}
i++;
for(int j=m;j>=1;j--){
if(a[i][j]==-1) a[i][j]=c[++cnt];
}
}