4137:最小新整數
總時間限制: 1000ms 內存限制: 65536kB
描述
給定一個十進制正整數n(0 < n < 1000000000),每個數位上數字均不爲0。n的位數爲m。
現在從m位中刪除k位(0<k < m),求生成的新整數最小爲多少?
例如: n = 9128456, k = 2, 則生成的新整數最小爲12456
輸入
第一行t, 表示有t組數據;
接下來t行,每一行表示一組測試數據,每組測試數據包含兩個數字n, k。
輸出
t行,每行一個數字,表示從n中刪除k位後得到的最小整數。
樣例輸入
2
9128456 2
1444 3
樣例輸出
12456
1
問題鏈接:Bailian4137 最小新整數
問題簡述:(略)
問題分析:
從高位開始,找相鄰2位滿足高位大於低位的,刪除高位,若不存在高位大於低位的情況則刪除末位。重複這個過程,直到刪除k位爲止。
如果n位整數爲d1d2…dkdk+1…dn,若dk>dk+1那麼d1d2…dk…dn>d1d2…dk+1…dn,所以這時應該刪除高位dk。而且可以證明,應該優先刪除高位的這種情況,纔可以保證得到最小的數。
程序說明:(略)
參考鏈接:(略)
題記:(略)
AC的C++語言程序如下:
/* Bailian4137 最小新整數 */
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 10 + 1;
char s[N];
int main()
{
int t, k;
scanf("%d", &t);
while(t--) {
scanf("%s%d", s, &k);
int len = strlen(s);
while(k--) {
for(int i = 0; i < len; i++)
if(s[i] > s[i + 1]) {
for(int j = i; j < len; j++) s[j] = s[j + 1];
break;
}
len--;
}
printf("%s\n", s);
}
return 0;
}