Glaciaxion 题解

文章讨论了一个关于冰川融化的问题,给定一系列状态(N和Y表示第一次和非第一次状态),目标是找到字典序最小的状态转换方案。文章分为无解和有解两种情况分析,并给出了C++代码示例。
摘要由CSDN通过智能技术生成

题目

题目链接

n n n个冰川,每次有状态NY。分别表示第一次状态和非第一次状态。给一串状态,请字典序最小的方案。若没有方案,输出No solution

思路分析

首先我们分两块分析:无解与有解

无解

  • 如果第一个状态就是Y,那么一定无解。因为前面根本没有第一次融化,不可能有后面的融化。
  • 如果N的个数大于 n n n,那么根本没有那么多山来融化。

有解

如果无解,就有解
因为有解,那么我们就可以枚举。也要分两种情况。

  • 如果是N那么就输出未融化山中的最小编号,可以用cnt来记录。
  • 如果是Y,因为字典序最小且1在前面一定被融化了,所以输出1

AC代码

为了防止抄代码。所以缺少代码,请自行根据文章补充。

#include<bits/stdc++.h>
using namespace std;
#define cin(x) scanf("%d",&x)
#define cout(x) printf("%d ",x)
#define endl puts("")
int n,m,cnt,ans[(int)1e6];
bool bg;//用bg记录第一位是否为Y
string str;
signed main(){
        cin(n);cin(m);cin>>str;
		for(int i = 0;i<str.size();i++){
			if(i==0){
				if(str[i]=='Y') {
					//特判,自己写
				}else {
					cnt++;
					ans[++ans[0]] = cnt;//记录答案
				}
			}else{
				if(str[i]=='Y') //根据文章自己写
				else {
					//记录答案,自己写
				}
			}
		}
		if(cnt>n||bg){
			puts("No solution");
			//情况无解
		}else {
			for(int i = 1;i<=ans[0];i++){
				cout(ans[i]);
				//输出答案
			}
		}
		return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值