链接[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;
}
京公网安备 11010502036488号