删除字符问题(贪心)
生活随笔
收集整理的這篇文章主要介紹了
删除字符问题(贪心)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 /*
2 鍵盤(pán)輸入一個(gè)高精度的正整數(shù)n(<=240位),去掉任意s個(gè)數(shù)字后剩下的數(shù)字按原左右次序?qū)⒔M成一個(gè)新的正整數(shù)。
3 編程對(duì)給定的n和s,尋找一種方案,使得剩下的數(shù)最小。
4 Simple Input
5 178543
6 4
7 Simple Output
8 13
9 */
10 #include <iostream>
11 #include <string>
12 using namespace std;
13 string s;
14 int num;
15 void fun()
16 {
17 int i,j,k,t;
18 int size = s.length();
19 for(i=0;(s.length()+num)>size;)
20 {//必須是i<s.length(),不是i<s.length()-1,否則456123 3會(huì)輸,123而不是12, 因?yàn)樽詈蟮?會(huì)因i<s.length()-1而直接結(jié)束,不在進(jìn)行if比較
21 //正確結(jié)果應(yīng)該是以第(s.length()+num)==size結(jié)束
22 //所以i<s.length()條件可以不要
23 if(s[i]>s[i+1])
24 {
25 s.erase(i,1);
26 i = 0;
27 continue;
28 }
29 else
30 i++;//不能放在for內(nèi),因?yàn)?
31 }
32 cout<<s<<endl;
33 }
34
35 int main()
36 {
37 int i,j,k,t;
38 while(cin>>s>>num)
39 {
40 fun();
41 s.clear();
42 }
43 return 0;
44 }
45 //注意:每次刪除最大的數(shù)字是不對(duì)的,該題的貪心策略是刪除一個(gè)數(shù)字后剩下的數(shù)是刪除其他數(shù)字中最小的,
46 //如:178456129 3,正確結(jié)果是145129,錯(cuò)誤結(jié)果是145612
?剛才同學(xué)說(shuō):申請(qǐng)一個(gè)棧從左往右掃描,如果新入棧元素小于棧頂元素則彈棧并計(jì)數(shù)cnt(刪除的字符個(gè)數(shù)),如果最后cnt<num,則繼續(xù)彈棧num-cnt次,最后需要借助另一個(gè)棧逆序輸出,cnt == num時(shí)并輸出沒(méi)入棧的剩余數(shù)字;不可用雙端隊(duì)列或者隊(duì)列(因?yàn)殡p端隊(duì)列只不過(guò)是可在對(duì)頭插入,并不能在隊(duì)尾刪除),或者直接使用數(shù)組模擬棧,最后從前往后輸出剩余的元素。
轉(zhuǎn)載于:https://www.cnblogs.com/hxsyl/archive/2012/08/23/2652029.html
總結(jié)
以上是生活随笔為你收集整理的删除字符问题(贪心)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: poj 2817 WordStac
- 下一篇: Disable auto select