暑期ACM队内练习赛 H题 数字游戏

     H 数字游戏

给你一个N位数,从中去掉K个数字,能得到的最大的数是多少?

INPUT 

T测试数据,每组测试数据第一行由NK2个整数组成(1 ≤ K < N ≤ 500 000),第二行是N位数(非0开头)。 

OUTPUT 

对每组数据输出去掉K个数字得到的最大数。 

SAMPLE TESTS 

IN

OUT

3

4 2 

1924

7 3 

1231234

10 4 

4177252841

94

3234

775841

 

program:

#include 
#include 
#include 

using namespace std;

const int MAXN = 500005;

char s[MAXN], a[MAXN];
vector< int > v[10];

int main( void ) 
{
       // freopen( "d.in","r",stdin );
   // freopen( "out.txt","w",stdout );
    
  int n, k,t;
      scanf("%d",&t);
while(t--)
{
    for(int i=0;i<10;i++)
          v[i].clear();
    scanf( "%d %d", &n, &k );
    scanf( "%s", s );
  
    for( int i = n-1; i >= 0; --i )
          v[ s[i]-'0' ].push_back( i );

    int m = n-k, p = 0;
    for( int i = 0; i < m; ++i ) 
       { 
          //biramo n-k znamenaka
           for( int j = 9; j >= 0; --j ) 
               {
                   while( v[j].size() > 0 && v[j].back() < p )
                            v[j].pop_back();
                   if( v[j].size() > 0 && n-v[j].back()-1 >= m-i-1 ) 
                    { 
                            p = v[j].back();
                              break;
                    }
               }
            a[i] = s[p]; 
            p++;
       }

  a[m] = '\0';
  puts( a );
}
  return 0;
}


 

 


 

 

你可能感兴趣的:(DP)