题目地址:http://codeforces.com/contest/1209/problem/C
题意:一个由由0~9组成的字符串,分别赋值1,2。按先后顺序先排1,再排2,实现不递减。
思路:枚举0~9即可,要注意枚举的这个值可以同时为1和2,可用是否有在2数列的大于它来判断。
一开始以为不递减就可以直接排1,2,一直W在样例一。。。后面又超时,定义的数组大小变为n+5之后就行了,有点懵。
AC代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 typedef long long ll; 6 int main(){ 7 int t; 8 cin>>t; 9 while(t--){ 10 int n,a[200005]; 11 cin>>n; 12 char s; 13 for(int i=0;i<n;i++){ 14 cin>>s; 15 a[i]=s-'0'; 16 } 17 bool flag=false; 18 int j; 19 int d[n+5]={0}; 20 for(j=0;j<10;j++){ 21 int b[n+5]={0},c[n+5]={0},num2=0,num1=0; 22 for(int i=0;i<n;i++){ 23 if(a[i]>j){ 24 c[num2++]=a[i]; 25 d[i]=2; 26 } 27 else if(a[i]<j){ 28 b[num1++]=a[i]; 29 d[i]=1; 30 } 31 else if(a[i]==j){ 32 if(num2==0||j==c[num2-1]){ 33 c[num2++]=j; 34 d[i]=2; 35 } 36 else{ 37 b[num1++]=j; 38 d[i]=1; 39 } 40 } 41 } 42 bool pd=true; 43 for(int i=1;i<num1;i++) 44 if(b[i]<b[i-1]){ 45 pd=false; 46 break; 47 } 48 for(int i=1;i<num2;i++) 49 if(c[i]<c[i-1]){ 50 pd=false; 51 break; 52 } 53 if(pd){ 54 flag=true; 55 break; 56 } 57 } 58 if(flag){ 59 for(int i=0;i<n;i++) 60 cout<<d[i]; 61 cout<<endl; 62 } 63 else cout<<"-"<<endl; 64 } 65 return 0; 66 }