您的位置:首页 > 编程语言 > PHP开发

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

2012-09-14 11:41 204 查看
     H 数字游戏

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

INPUT 

有T测试数据,每组测试数据第一行由N和K2个整数组成(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;
}


 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息