其實,這是由兩條題目湊在一起,拼接而成的一條題目。
而這兩題,在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 一本通...