【OpenJ_Bailian - 4137】最小新整数 (贪心)
【OpenJ_Bailian – 4137】最小新整数 (贪心)
最小新整数
Descriptions:
给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。
现在从m位中删除k位(0<k < m),求生成的新整数最小为多少?
例如: n = 9128456, k = 2, 则生成的新整数最小为12456
Input
第一行t, 表示有t组数据;
接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n, k。
Output
t行,每行一个数字,表示从n中删除k位后得到的最小整数。
Sample Input
2 9128456 2 1444 3
Sample Output
12456 1
题目链接:
https://vjudge.net/problem/OpenJ_Bailian-4137
一开始简单的认为是删除最大数,结果WA了一次,然后发现这组数据
1528 1
如果直接删最大的8,结果为152,如果删掉5,结果为128,显然删掉5才是最佳答案。
后来发现
1.每次都删去大于右边的数
2.如果k>0, 删去最大的数
3.如果还k>0, 此时所有数都相等,那就依次删吧
AC代码
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <sstream> #define mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define ME0(x) memset(x,0,sizeof(x)) using namespace std; int n,k; string s; int findMax() { int pos=-1;//最大数值的位置 int maxn=-1;//最大的数值 for(int i=0; i<s.length(); i++) { if(s[i]-'0'>maxn) { maxn=s[i]-'0'; pos=i; } } return pos; } int main() { cin>>n; while(n--) { cin >> s>>k; //先删去大于右边的数 for(int i=0; i<s.length()-1&&k>0; ++i) { if(s[i]>s[i+1]) { s.erase(i,1); --i; --k; } } //如果k>0,删去最大的数 while(k>0) { s.erase(findMax(),1); --k; } //k仍大于0,此时所有数都相等,依次删除即可 if(k>0) { for(int i=0; i<s.length(); ++i) { s.erase(i,1); --i; --k; } } cout<<s<<endl; } }