time limit: 3 second
memory limit: 2 mb
輸入乙個數字串s和整數k(k小於數字串s的長度),從s中刪去k個數字,使剩餘數字在保持相對位置不變的情況下構成乙個值最小的整數。例如:s='19990608',k=4,處理結果為608。如果串s含有非數字字元,則輸出'error',如果k的值大於串s的長度,則輸出'error'。
兩行,第一行為數字串s,第二行為整數k。
一行,處理結果或error
19990608
4
608【題解】
這是一道貪心題。
先考慮一種比較簡單的情況。
123456,接下來 刪除乙個數字。
如果刪掉1 就是2 開頭了
這顯然不是最小的,因為我們可以刪掉2,那這個數字就是1開頭的了,但刪掉2第二位是3,如果刪掉3 第二位就是2 這樣更優。。。
如此如此可以知道 刪掉6是最優的情況。
再來複雜點
489456 這裡就不能單純地刪掉6了。我們可以把它分成兩個部分
489 和 456 如果單純対這兩個數做刪除操作 我們可以容易地得到答案。
那麼問題來了,我們應該刪掉9還是刪掉6呢?
答案是9,因為如果我們讓後者更小,最後結果是489***
而如果讓前者更小,最後結果則是484***,顯然讓前者更小是更優的解法。
或者你可以把這489和456看成x和y,然後把這兩個數組成乙個2位數
最後的結果是x*10+y,那讓x更小顯然是更優的解。
如果是484950這個 就把 48 和49 和50 看成x,y,z顯然也是讓x最小是最優的解。
就是這樣吧。
這裡的9和6是兩個遞增區間的最後乙個數字。
while (a[i] <= a[i+1]) i ++ ,這樣找到i,然後用erase刪掉就好。
不要忘記去除開頭可能多餘的0;
【**】
#include #include #include #include using namespace std;
string s1;
int n,k;
void s_p()
void input_data()
}void get_ans()
int m = s1.size();
int i = 0;
while (m > 1 && s1[i] == '0') //刪掉開頭多餘的0
}void output_ans()
int main()
刪去k個數字後的最小值
參考 程式設計師小灰 substring 方法返回字串的子字串。語法public string substring int beginindex 或public string substring int beginindex,int endindex 引數beginindex 起始索引 包括 索引從...
刪去k個數字後的最小值(貪心演算法思想實現)
題目 給出乙個整數,從該整數中去掉k個數字,要求剩下的數字形成的新整數盡可能小。解題思路 實現 刪除整數的k個數字,獲得刪除後的最小值 param num 原整數 param k 刪除數量 return 返回刪除後的最小值 public static string removekdigits str...
最小的k個數字
題目 輸入n個整數,找出其中最小的k個數。例如輸入4 5 1 6 2 7 3 8這8個數字,則最小的4個數字是1 2 3 4。方法一 根據陣列特點找出時間複雜度為o n 的演算法 include includeusing namespace std int randomofrange int sta...