2021-10-04模拟赛

本文介绍了NOIP提高组竞赛中涉及的算法问题,包括玩具谜题、神奇的幻方和蚯蚓问题。针对每个问题,提供了算法思路和模拟解法,并展示了部分代码实现。此外,还提到了列队问题,虽然得分较低,但提出了可能的二叉堆模拟解决方案。通过这些实例,读者可以深入理解并学习如何运用模拟和二叉堆等算法解决实际问题。
摘要由CSDN通过智能技术生成

P1563 [NOIP2016 提高组] 玩具谜题

算法思路:模拟

#include<bits/stdc++.h>
using namespace std;
struct human{
	bool face;
	char name[15];
};
struct ask_{
	bool direct;
	int step;
};
ask_ b[100010];
int n,m;
human a[100010];
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d%s",&a[i].face,a[i].name);
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&b[i].direct,&b[i].step);
	}
	int t=1;
	for(int i=1;i<=m;i++){
		bool d=(a[t].face^b[i].direct);
		if(d==1){
			t=t+b[i].step;
		}
		else{
			t=t-b[i].step;
		}
		if(t<=0) t=t+n;
		if(t>n) t=t-n;
	}
	printf("%s",a[t].name);
	return 0;
}


得分: 100 {\color{Green}100} 100

P2615 [NOIP2015 提高组] 神奇的幻方

算法思路:

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	cin>>n;
	int a[n+1][n+1];
	memset(a,0,sizeof(a));
	int x,y;
	x=1;
	y=n/2+1;
	for(int i=1;i<=n*n;i++){
		a[x][y]=i;
		if(i==n*n) break;
		else{
			if(x==1&&y==n){
				x++;
			}
			else if(x==1){
				y++;
				x=n;
			}
			else if(y==n){
				y=1;
				x--;
			}
			else if(a[x-1][y+1]!=0){
				x++;
			}
			else{
				x--;
				y++;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	return 0;
}


得分: 100 {\color{Green}100} 100

P2827 [NOIP2016 提高组] 蚯蚓

算法思路:二叉堆,模拟
可能的解法:
得分: 10 {\color{Red}10} 10
订正代码:


反思小结:

P3960 [NOIP2017 提高组] 列队

算法思路:二叉堆,模拟
可能的解法:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,m,q;
	cin>>n>>m>>q;
	int a[n+5][m+5];
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			a[i][j]=(i-1)*m+j;
		}
	}
	for(int i=1;i<=q;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		printf("%d\n",a[x][y]);
		int u=a[x][y];
		for(int j=y;j<m;j++){
			a[x][j]=a[x][j+1];
		}
		if(n!=1){
			for(int j=x;j<n;j++){
				a[j][m]=a[j+1][m];
			}
		}
		a[n][m]=u;
	}
	return 0;
}

得分: 0 {\color{Red}0} 0
订正代码:

在这里插入代码片

反思小结:
总得分/总分:210
整场比赛的总结:

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值