洛谷 P1323 刪數問題

2021-10-02 19:31:27 字數 1739 閱讀 2497

其實,這是由兩條題目湊在一起,拼接而成的一條題目。

而這兩題,在js夏令營冬令營,nt國慶衝刺營中都有出現。

分別是醜數(佇列部分的題目,但似乎題面各有不同,這是其中的乙個版本,是符合真正數學定義「醜數」的)和刪數問題(沒錯,名字一模一樣)(貪心部分題目)後一題可參考我寫的題解。

把本題拆分成兩部分。首先,把這些元素全都找出來並拼接在一起,然後,逐漸刪去。

找元素由於題中說是「最小的k個元素」「從小到大」,所以是依次新增元素,而每次都 o(n) 去找目前最小的元素顯然不現實,手寫二分由太過麻煩,所以考慮stl中的優先佇列->priority_queue

priority_queue 預設是大根堆(即大的元素在前),所以我們需要修改引數,變為小根堆,這樣就可以每次 o(logn) 找出當前最小的元素,取出並新增它的兩個附屬元素。

priority_queue<

int,vector<

int>

,greater<

int>

> q;

//int 是資料型別,vector 是儲存方式(據說也可以用其他的),greater/less 控制大根堆,小根堆

拼接

在這裡給大家介紹一種黑科技:to_string(很不幸的是,它隸屬於 c++11,所以競賽中不能使用,但在平時做題時使用是沒有問題的)

to_string 可以將數字轉化為所對應的字串(特殊、奇怪的字元就不要出現了)不僅僅是 int !double,float,long long,long double 等都是支援的。

所以我們在取出目前最小元素後,可以使用 to_string 將其轉化為字串,然後進行字串的累加。(若不用 to_string,也可以通過取模的方式,將數字依次取出,然後轉化成 char 進行拼接)

尋找要刪除的數字

可以發現:本質上就是維護乙個不下降序列

並不會數學證明,故通過舉例說明:

29523->9523->953->95->9

其實就是與它同名的刪數問題的翻版,本題要求剩下的數最大,它要求剩下的數最小,規律是反過來的(大於號、小於號的區別)

如何刪除

使用 string 中的 erase 函式。寫法:

str.

erase

(起始位置,刪除的長度)

5.迴圈的寫法

由於不知道如何刪除,外面應該是乙個 while(1) 或 for( ; ; ),內部列舉字串中的每位。刪去乙個,記錄一次,達到總次數便立即退出,可使用 exit(0) 直接退出整個程式(也可以用標記的形式,達到總次數後更改標記,外部迴圈每次都判斷標記)

#include

using

namespace std;

int k,m;

priority_queue<

int,vector<

int>

,greater<

int>

> cre;

string s;

intmain()

cout

for(;;

)break;}

}}return0;

}

洛谷P1106 刪數問題

鍵盤輸入乙個高精度的正整數n,去掉其中任意k個數字後剩下的數字按原左右次序將組成乙個新的正整數。程式設計對給定的n和k,尋找一種方案使得剩下的數字組成的新數最小。輸出應包括所去掉的數字的位置和組成的新的整數。n不超過250位 輸入資料均不需判錯。輸入格式 n 高精度的正整數 k 需要刪除的數字個數 ...

洛谷 P1106 刪數問題

題目描述 鍵盤輸入乙個高精度的正整數n 不超過250位 去掉其中任意k個數字後剩下的數字按原左右次序將組成乙個新的正整數。程式設計對給定的n和k,尋找一種方案使得剩下的數字組成的新數最小。輸入格式 n 高精度的正整數 k 需要刪除的數字個數 輸出格式 最後剩下的最小數。輸入輸出樣例 輸入 1複製 1...

洛谷p1106 刪數問題

洛谷t2755暫時過不去了 刪數問題 傳送門 洛谷演算法標籤 emmmm 刪數問題又牽扯到了字串。因為畢竟高精度的數240位呢!要是輸入乙個整型,要碼240行來求出每一位 怕是還沒求出來就tel了。所以我們又用到了字串 真的很常用哎 這個題ac起來還是比較easy的,畢竟一本通上有題。but 一本通...