洛谷 P11120 [ROIR 2024 Day 1] 登机 题解

Part 0 前言

这种题一看就是签到题,也是特水,建议评红或橙。

Part 1 思路

思路就是先将已有位置先填对称,然后将剩余还未添加的乘客以对称方式填入。

首先可以特判掉需要的位置大于空位的情况,直接输出 Impossible

然后用数组记录 .X 的位置,先遍历所有 X 的位置,然后看他的对称位置是否为空,若为空,则填入 X,然后 m--。最后若 m < 0 m < 0 m<0,则说明现有的人不能满足对称(太少了),若 m   m o d   2 = 0 m \bmod 2 = 0 mmod2=0,则说明还未添加的乘客不能以对称方式填入,这两种都应输出 Impossible

最后遍历所有 . 的位置,以对称方式填入即可。

Part 2 AC Code

#include<bits/stdc++.h>
using namespace std;
char a[1010][10];
struct seat{
	int x;
	int y;
}Map[10100],Mpa[10100];//记录位置
int main()
{
	int n,m,sum1=0,sum2=0,num1=1,num2=1;//记录数量
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=6;j++){
			cin>>a[i][j];
			if(a[i][j]=='X'){
				sum1++;
				Map[num1].x=i;
				Map[num1].y=j;
				num1+=1;
			} 
			else{
				sum2++;
				Mpa[num2].x=i;
				Mpa[num2].y=j;
				num2+=1;
			}
		}
	} 
	if(n*6-sum1<m){
		cout<<"Impossible";
		return 0;
	}//特判
	for(int i=1;i<=sum1;i++){
		if(a[Map[i].x][7-Map[i].y]!='X') m--,a[Map[i].x][7-Map[i].y]='X';//若对称位上没有,则填入
	}
	if(m<0||m%2==1){
		cout<<"Impossible";
		return 0;
	}//判定
	for(int i=1;i<=sum2;i++){
		if(m==0) break;
		if(a[Mpa[i].x][7-Mpa[i].y]!='X') m-=2,a[Mpa[i].x][7-Mpa[i].y]='X',a[Mpa[i].x][Mpa[i].y]='X';;//若对称位上没有,则填入
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=6;j++){
			cout<<a[i][j];
		}
		cout<<endl;
	} 
	return 0;
}
/*完结撒花(*^▽^*)*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值