入门赛这么喜欢出大模拟题吗

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 。当未标记时,扫到LR ans 自增。
  • 化为数组
    )视为 0 ,将(视为 -1L视为 1R视为 3L'视为 2R'视为 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];
	}		
}
2 个赞