題目描述
有一十進位制正整數,移除其中的 k 個數,使剩下的數字是所有可能中最大的。
假設:字串的長度一定大於等於 k
字串不會以 0 開頭
輸入描述:
一行由正整數組成的數字字串,和乙個正整數 k,兩個資料用空格隔開,如:1432219 3。
字串長度不超過2000,k<=2000。
輸出描述:
移除 k 位後可能的最大的數字字串。
如1432219
移除1, 2, 1
這 3 個數字後得到432
,為所有可能中的最大值。
示例1輸入
複製
1432219 3
輸出
複製
4329
可以發現 :
乙個數字陣列可以劃分成很多個子陣列,這些子陣列可能單調增
單調減
或者平滑不變
如果這個數num
=12349685
num=12349685
num=12
3496
85以遞增
子陣列開頭,則只要還可以刪除數字,刪開頭
一定最優
如果這個數num
=43217892
num=43217892
num=43
2178
92以遞減
子陣列開頭,且能刪的個數小於4
,則開頭一定不能刪
應該刪除321
32132
1則三個數
只要還能刪,我們就必須留下最長單調減
序列,一定是最優答案
考慮單調棧(看別人的**才知道的,一開始考慮貪心自閉了很久)
//設數字為24593215
//如果[0,k]是遞增的,刪掉[0,cnt(cnt//找到所有遞增序列,刪掉
string str;
cin >> str >> k;
stack<
char
> stk;
for(
auto ch : str)
stk.
push
(ch)
;//num[i]入棧
}string ans;
while
(k--
)while
(!stk.
empty()
)reverse
(ans.
begin()
, ans.
end())
;//記得翻轉
cout << ans << endl;
完整**
#define debug
#ifdef debug
#include
#include
"/home/majiao/mb.h"
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define maxn ((int)1e5+7)
#define ll long long int
#define inf (0x7f7f7f7f)
#define fori(lef, rig) for(int i=lef; i<=rig; i++)
#define forj(lef, rig) for(int j=lef; j<=rig; j++)
#define fork(lef, rig) for(int k=lef; k<=rig; k++)
#define qaq (0)
using
namespace std;
#define show(x...) \
do while (0)
void
err(
)template
<
typename t,
typename..
. a>
void
err(t a, a.
.. x)
namespace fastio
void
print()
template
<
typename t,
typename..
. t2>
inline
void
read
(t &x, t2 &..
. oth)
while
(isdigit
(ch)
) x *
= f;
read
(oth...
);}template
<
typename t,
typename..
. t2>
inline
void
print
(t x, t2.
.. oth)
while
(x/=10)
;while
(p3>=0)
putchar
(print_f[p3--])
;putchar
(' ');
print
(oth...
);}}
// namespace fastio
using fastio::print;
using fastio::read;
int n, m, q, k;
bool up[maxn]
, vis[maxn]
;int
main()
stk.
push
(ch);}
string ans;
while
(k--
)while
(!stk.
empty()
)reverse
(ans.
begin()
, ans.
end())
; cout << ans << endl;
#ifdef debug
clock_t etime =
clock()
;printf
("rum time: %lf 秒\n",(
double
)(etime-stime)
/clocks_per_sec)
;#endif
return0;
}
牛客網拼多多校招最大乘積
給定乙個無序陣列,包含正數 負數和0,要求從中找出3個數的乘積,使得乘積最大,要求時間複雜度 o n 空間複雜度 o 1 輸入描述 輸入共2行,第一行包括乙個整數n,表示陣列長度 第二行為n個以空格隔開的整數,分別為a1,a2,an 輸出描述 滿足條件的最大乘積 示例1輸入 43 4 1 2 輸出2...
牛客網 2019校招 瞌睡
小易覺得高數課太無聊了,決定睡覺。不過他對課上的一些內容挺感興趣,所以希望你在老師講到有趣的部分的時候叫醒他一下。你知道了小易對一堂課每分鐘知識點的感興趣程度,並以分數量化,以及他在這堂課上每分鐘是否會睡著,你可以叫醒他一次,這會使得他在接下來的k分鐘內保持清醒。你需要選擇一種方案最大化小易這堂課聽...
牛客網 2018校招真題 最大乘積
題目 給定乙個無序陣列,包含正數 負數和0,要求從中找出3個數的乘積,使得乘積最大,要求時間複雜度 o n 空間複雜度 o 1 解法一 思路 不論給定的陣列是什麼,最大的乘積只有兩種情況 1.三個最大的數的乘積 都是正數或者都是負數 2。三個最小的數的乘積 都是負數 選出給定陣列中的最大的三個數和最...