请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,
比如当n=92081346718538,m=10时,则新的最大数是9888
2 92081346718538 10 1008908 5
9888 98
题意可以简化为在长度为n的数中按照原序列选择n-m位数使得值最大。
可以这样考虑:这n-m位数先选择最高位,从右往左第n-m位开始查找,查找终点为第0位,找到后将这个
位置标记一下,作为下一次高位的终止查找位标记,以此类推。
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; int string_len, index = 0, count = 0; bool cmp(char a, char b) { return a > b; } char getMax(string s) { sort(s.begin(), s.end(), cmp); return s[0]; } int getIndex(char c, string s, int index1) { int index = 0; int len = s.size(); for (int i = index1; i < len; i++){ if (c == s[i]){ index = i; break; } } return index+1; } int main() { // freopen("in.txt", "r", stdin); int string_len, index, count = 0; char S[101]; int N, m; scanf("%d", &N); string s; while(N--) { cin >> s >> m; index = 0; count = 0; string_len = s.size(); int m1 = string_len - m; string s2 = s.substr(0, m+1); while(count <= string_len - m) { S[count] = getMax(s2); index = getIndex(S[count], s, index); count++; if (count >=string_len-m) break; s2 = s.substr(index, string_len-m1-index+2); m1--; } for (int i = 0; i < count; i++) printf("%c", S[i]); puts(""); } return 0; }
C语言的
#include <stdio.h> #include <string.h> int main() { int k,l,max,z; char s[105],ans[105]; scanf("%d",&z); while(z--) { scanf("%s%d",s,&k); l = strlen(s); for(int i=0,q=-1;i<l-k;i++) { max = 0; for(int j=q+1;j<=k+i;j++) if(max < s[j]) max = s[j] , q = j; ans[i] = max; } ans[l-k] = '\0'; puts(ans); } return 0; }