链接[https://vjudge.net/contest/413647#problem/C](http://www.nowcoder.com)
题意:给你n个数字的集合,划分成两个集合,让你确定每个数字在哪个集合,使得按原来顺序,集合1在集合2前面,能够构成单调不下降,输出任意解。
思路:
想了大概一小时吧,也是没想出来,原来的思路是尽量找小的变成1,然后从该位置往右扫把比它大的数都放在一起变成1,否则其他没被标记的都变成2,最后判断是否合理,后来想想这样得不对的,hack数据:5 25546 ,然后看了题解,我们把所有方案划分成划分为x,由于x比较小,把比x小的放在一边,比x大的放在另一边,如果碰到等于x的尽量放在右边,否则放左边,判断是否合法。
ac代码:
#include<iostream> #include<cstring> using namespace std; int a[200010]; int col[200010]; int n; bool check(int x) { int lmax=-1,rmax=-1; for(int i=1;i<=n;i++) { if(a[i]<x) { if(a[i]<lmax) return 0; col[i]=1; lmax=a[i]; } else if(a[i]==x) { if(a[i]>=rmax) rmax=a[i],col[i]=2; else lmax=a[i],col[i]=1; } else { if(a[i]<rmax) return 0; col[i]=2; rmax=a[i]; } } return 1; } int main() { int t; cin>>t; while(t--) { cin>>n; for(int i=1;i<=n;i++) scanf("%1d",&a[i]); bool ok = 0; for(int i=0;i<=9;i++) if(check(i)) { ok=1; break; } if(ok) for(int i=1;i<=n;i++) cout<<col[i]; else cout<<"-"; cout<<endl; } return 0; }