2021-10-04 模拟赛

国庆模拟赛(二)

    • 1、[P1563 [NOIP2016 提高组] 玩具谜题](https://www.luogu.com.cn/problem/P1563)
    • 2、[P2615 [NOIP2015 提高组] 神奇的幻方](https://www.luogu.com.cn/problem/P2615)
    • 3、[P2827 [NOIP2016 提高组] 蚯蚓](https://www.luogu.com.cn/problem/P2827)
    • 4、[P3960 [NOIP2017 提高组] 列队](https://www.luogu.com.cn/problem/P3960)

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

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

#include
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

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

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

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

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

你可能感兴趣的