牛客 小公尺校招 最大新整數 單調棧

2021-10-07 01:36:56 字數 3398 閱讀 5891

題目描述

有一十進位制正整數,移除其中的 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。三個最小的數的乘積 都是負數 選出給定陣列中的最大的三個數和最...