题目
题目链接
n
n
n个冰川,每次有状态N
和Y
。分别表示第一次状态和非第一次状态。给一串状态,请字典序最小的方案。若没有方案,输出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;
}