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

浙公网安备 33010602011771号