解密类游戏--删除数字

题目描述

小BX正在玩一个解密类游戏,但是他遇到了一个难题,这里有一些数,想要进入到下一关的话,就需要从数K中删去要求的N个数字使剩下的数字组成的数最大,为了解决这个问题,小BX请你动用编程的力量为他解决这一难题。

输入

有多组测试数据。第一行有一个数T,表示有T组测试数据。接下来的T行,每一行有两个数K和N ( 0<= K <= 2^31 ,N小于K的位数)。

输出

对每一组数据输出删除若干数字后剩下的数字组成的那个最大数。

样例输入

1
917845 3

样例输出

985

解析

一开始参考网上代码,时间超限。

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int t, N;
string K;
int main()
{
    cin >> t;
    while (t--)
    {
        cin >> K >> N;
        while (N > 0)//核心代码
        {
            int i = 0;
            while (i < K.size() && K[i] >= K[i + 1])
            {
                i++;
                K.erase(i, 1);
                N--;
            }
        }			//核心代码
        cout << K << endl;
		K.clear();
    }
    system("pause");
    return 0;
}

后来改了一下,优化提速,得到

#include <iostream>
#include <string>
using namespace std;
int t, n;
string k;
int main()
{
	cin >> t;
	while (t--)
	{
		cin >> k >> n;
		while (n--)
		{
			int flag = 0;
			for (string::iterator i = k.begin(); i != (k.end() - 1); i++)
			{
				if (*i < *(i + 1))
				{
					flag = 1;
					k.erase(i, 1);
					break;
				}
			}
			if (!flag)
				k.pop_back();
		}
		cout << k << endl;
	}
	system("pause");
	return 0;
}

 

posted @ 2020-03-22 15:32  我等着你  阅读(368)  评论(0)    收藏  举报