HDU4550+贪心
/* 贪心 先挑出最小的Mm,然后在Mm左侧的按情况考虑,右侧的按顺序排列。 */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<iostream> #include<queue> #include<map> #include<math.h> using namespace std; typedef long long ll; //typedef __int64 int64; const int maxn = 105; const int inf = 0x7fffffff; const double pi=acos(-1.0); const double eps = 1e-8; char s[ maxn ]; char Min[ 3*maxn ]; int main(){ int T; scanf("%d",&T); while( T-- ){ scanf("%s",s); int len = strlen( s ); for( int i=0;i<3*maxn;i++ ){ Min[ i ] = '@'; }//init int lpos,rpos,mid; mid = 100; lpos = 100; rpos = 100; char Mm = '9'; int Mmpos; for( int i=0;i<len;i++ ){ if( s[i]!='0'&&Mm>=s[i] ){ Mm = s[i]; Mmpos = i; } } Min[ mid ] = s[0]; for( int i=1;i<len;i++ ){ if( i<Mmpos ){//大的在right if( s[i]>Min[lpos] ){ Min[ ++rpos ] = s[i]; } else if( s[i]<=Min[lpos] ){ Min[ --lpos ] = s[i]; }//注意这里的“=”,因为Min[lpos]后面的都比s[i]大 } else if( i==Mmpos ){ Min[ --lpos ] = s[i]; } else {//全部放在后面 Min[ ++rpos ] = s[i]; } } for( int i=lpos;Min[i]!='@';i++ ) printf("%c",Min[i]); printf("\n"); } return 0; }