一看数据范围很小,直接暴力搜索判断,枚举m位看能否满足条件,递归的时候分奇偶,因为每次加的方向不一样,之后比对一下是否相同以及是否比他大
#include<iostream> #include<cstring> #include<cstdio> #include<map> #include<algorithm> #include<queue> #define ull unsigned long long using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=1e5+10; int a[N]; string s; int m; int cnt; int num[N]; int dfs(int u,int l,int r,int x){ if(u==m+1){ return 1; } int i; for(i=1;i<=cnt;i++){ if(u%2!=0&&x!=a[i]&&l+a[i]>r){ num[u]=a[i]; if(dfs(u+1,l+a[i],r,a[i])) return 1; } if(u%2==0&&x!=a[i]&&r+a[i]>l){ num[u]=a[i]; if(dfs(u+1,l,r+a[i],a[i])) return 1; } } return 0; } int main(){ cin>>s>>m; int i; for(i=0;i<s.size();i++){ if(s[i]=='1'){ cnt++; a[cnt]=i+1; } } if(dfs(1,0,0,0)){ printf("YES "); for(i=1;i<=m;i++){ printf("%d ",num[i]); } cout<<endl; } else{ cout<<"NO"<<endl; } }