MarsOJ MSP-J2022初赛易错题解析

二.1.

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,a[239+7][239+7],dx[]={0,1,0,-1},dy[]={1,0,-1,0},dir,x=1,y=1,id=1;
bool check(int x,int y){
	return !(x<1||x>n||y<1||y>m||a[x][y]);
}
void work(int &x,int &y,int &id){
	a[x][y]=id++;
	int tx=x+dx[dir],ty=y+dy[dir];
	if(check(tx,ty))x=tx,y=ty;
	else{
		dir=(dir+1)%4;
		x=x+dx[dir];y=y+dy[dir];
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n*m;i++)work(x,y,id);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cout<<a[i][j]<<' ';
		}
		cout<<'\n';
	}
	return 0;
}

20.

错误原因:模拟不透彻

解析:

通过模拟,可以发现,最后全局变量dir的值应该是最后一次填数所指向的方向

 

2.

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = (1<<16)+39+7;
int n,sum[N],a[N],f[N];
int l(int x){
	return (x>>16);
}
int r(int x){
	return (x&0xffff);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		sum[r(a[i])]++;
	}
	for(int i=1;i<(1<<16);i++)sum[i]+=sum[i-1];
	for(int i=n;i>=1;i--)f[sum[r(a[i])]--]=a[i];
	memset(sum,0,sizeof(sum));
	for(int i=1;i<=n;i++)sum[l(f[i])]++;
	for(int i=1;i<(1<<16);i++)sum[i]+=sum[i-1];
	for(int i=n;i>=1;i--)a[sum[l(f[i])]--]=f[i];
	for(int i=1;i<=n;i++)cout<<a[i]<<' ';
	return 0;
}

  

26.

错误原因:考虑不周全

解析:
这道题很容易就可以排除AB,很多人就会选D,但是这道题有一个坑,就是i在2^16-1之后,还会加1,故选C

 

三.2.

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6+39+7;
int n,a[N],l=1;
queue<int>q;
int get_small(){
	if(l<=n&&q.size()){
		ll x=a[l],y=q.front();
		if(x<=y)return a[l++];
		else{
			ll t=q.front();q.pop();
			return t;
		}
	}else if(l<=n)return a[l++];
	else if(q.size()){
		ll t=q.front();q.pop();
		return t;
	}
	return 0;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	ll ans=0;
	for(int i=1;i<n;i++){
		ll a=get_small(),b=get_small();
		ans+=a+b;
		q.push(a+b);
	}
	cout<<ans;
	return 0;
}

 

42.

错误原因:没读题

解析:

很容易选择A或B,但题目中说的是合并n-1次,故选B

 

posted @ 2023-09-11 22:00  天雷小兔  阅读(214)  评论(0)    收藏  举报