2021-10-04 模拟赛

1、P1563 [NOIP2016 提高组] 玩具谜题

算法思路:模拟
可能的解法:???

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

const int N=1e5+10;

int n,m,now=0;
int d[N];
string s[N];

int main(){
	//freopen("toy.in","r",stdin);
	//freopen("toy.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++){
		scanf("%d",&d[i]);
		cin>>s[i];
	}
	while(m--){
		int dire,num;
		scanf("%d %d",&dire,&num);
		if(d[now]) num=-num;
		if(dire) num=-num;
		now=now+n-num;
		while(now>=n) now-=n;
	}
	cout<<s[now];
	return 0;
}

估分:100
实际得分:100
想法:大模拟,num正负左右横移 ,签到题。
(自认为写的还是比较短的)

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

算法思路:大模拟 × \times × 2
可能的解法:???

#include<bits/stdc++.h>

using namespace std;

int a[50][50];
int n;

int main(){
	//freopen("magic.in","r",stdin);
	//freopen("magic.out","w",stdout);
	scanf("%d",&n);
	int tot=n*n-1;
	a[1][n/2+1]=1;
	int i=1,j=n/2+1;
	while(tot--){
		if(i==1&&j!=n){
			i=n;j++;
		}
		else if(j==n&&i!=1){
			j=1;i--;
		}
		else if(i==1&&j==n){
			i++;
		}
		else if(a[i-1][j+1]==0){
			i--;j++;
		}
		else{
			i++;
		}
		a[i][j]=n*n-tot;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

估分:100
实际得分:100
想法:模拟 × \times × 2

3、P2827 [NOIP2016 提高组] 蚯蚓

算法思路:感觉类似前缀和
可能的解法:优先队列

#include<bits/stdc++.h>

using namespace std;

int const N=8*1e6;


int n,m,q,u,v,t,qz;
double p;
int a[N];

int main(){
	//freopen("earthworm.in","r",stdin);
	//freopen("earthworm.out","w",stdout);
	scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
	p=(double)u/v;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	int cnt=n;
	sort(a+1,a+cnt+1);
	for(int i=1;i<=m;i++){
		int x=a[cnt]+qz;
		if(i%t==0) printf("%d ",x);
		int d1=floor(p*x);
		int d2=x-floor(p*x);
		cnt++;a[cnt-1]=d1-qz-q;a[cnt]=d2-qz-q;
		sort(a+1,a+cnt+1);
		qz+=q;
	}
	printf("\n");
	for(int i=t;i<=cnt;i+=t){
		printf("%d ",a[cnt-i+1]+qz);
	}
	return 0;
}

估分:60
实际得分:35
一次订正(使用优先队列90pts)

#include<bits/stdc++.h>

using namespace std;

int n,m,q,u,v,t,qz;
double p;
priority_queue<int> a;

int main(){
	//freopen("earthworm.in","r",stdin);
	//freopen("earthworm.out","w",stdout);
	scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
	p=(double)u/v;
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		a.push(x);
	}
	for(int i=1;i<=m;i++){
		int x=a.top()+qz;
		if(i%t==0) printf("%d ",x);
		int d1=floor(p*x);
		int d2=x-floor(p*x);
		a.pop();
		a.push(d1-qz-q);
		a.push(d2-qz-q);
		qz+=q;
	}
	printf("\n");
	for(int i=1;i<=n+m;i++){
		if(i%t==0){
			int x=a.top();
			printf("%d ",x+qz);
		}
		a.pop();
	}
	return 0;
}

想法:高分易,满分难。

4、P3960 [NOIP2017 提高组] 列队

算法思路:模拟骗分
可能的解法:???

#include<bits/stdc++.h>

using namespace std;

int a[1010][30100];
int n,m,q;

int main(){
	//freopen("phalanx.in","r",stdin);
	//freopen("phalanx.out","w",stdout);
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			a[i][j]=(i-1)*m+j;
		}
	}
	while(q--){
		int x,y;
		scanf("%d%d",&x,&y);
		printf("%d\n",a[x][y]);
		int away=a[x][y];
		for(int i=y;i<m;i++){
			a[x][i]=a[x][i+1];
		}
		for(int i=x;i<n;i++){
			a[i][m]=a[i+1][m];
		}
		a[n][m]=away;
		/*for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				printf("%d ",a[i][j]);
			}
			printf("\n");
		}*/
	}
	return 0;
}

估分:40
实际得分:30
想法:紫题万岁!

总得分
265/400
反思:基础数据结构要会用 (priority_queue不会写的悲伤)
蒟蒻的国庆模拟赛(二)
——2021.10.4

PS:作为一名蒟蒻,对于八方神犇的合理建议都是感激不尽的儿~~

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值