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

这是一道关于ACM竞赛的题目,要求在给定的N位数中移除K个数字,目标是找到能形成的最大数。输入包含T组测试数据,每组包含N和K的值(1 ≤ K < N ≤ 500000),以及一个非0开头的N位数。输出需要展示每组数据移除K个数字后的最大数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     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 <cstdio>
#include <vector>
#include <algorithm>

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;
}


 

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值