7-9 删数问题 (10 分)(思路加详解)
生活随笔
收集整理的這篇文章主要介紹了
7-9 删数问题 (10 分)(思路加详解)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:題目
有一個長度為n(n <= 240)的正整數,從中取出k(k < n)個數,使剩余的數保持原來的次序不變,求這個正整數經過刪數之后最小是多少。
輸入格式:
n和k
輸出格式:
一個數字,表示這個正整數經過刪數之后的最小值。
輸入樣例:
178543 4結尾無空行
輸出樣例:
二:思路
思路:
1.首先貪心的策略是每次最優,那么結果就是最優的
2.那么這道題我們可以每次刪除序列中 升序的結尾,重復上述操作k次,這樣的話我們就能可以
這個結果的最優解了
解釋:因為在一串數中,我們想要其刪完某個數后其剩下的值最小,我們總想刪除大的數
那么剩下的數肯定要小呀 比如 12345 刪除5剩下的數是最小的
3.當然我們也可以刪除每次發生降序的時候 就把前一個數刪除
三:上碼
/**思路:1.首先貪心的策略是每次最優,那么結果就是最優的2.那么這道題我們可以每次刪除序列中 升序的結尾,重復上述操作k次,這樣的話我們就能可以這個結果的最優解了解釋:因為在一串數中,我們想要其刪完某個數后其剩下的值最小,我們總想刪除大的數那么剩下的數肯定要小呀 比如 12345 刪除5剩下的數是最小的 3.當然我們也可以刪除每次發生降序的時候 就把前一個數刪除 **///100012 2 1#include<bits/stdc++.h> using namespace std;int main(){string str;int k,flag = 0;vector<char>v;cin >> str >> k;for(int i = 0; i < str.size(); i++){v.push_back(str[i]);} while(k--){int i = 0;flag = 0;vector<char>:: iterator t = v.begin();//這里主要是為了調用 v.erase()的庫函數刪除元素while(i != v.size()-1){//注意這里的減一 因為下方的v[i+1] 否則會出現段錯誤if(v[i] > v[i+1]){//如果出現后一個數小于前一個數那么這就是這一趟的遞增的終點 v.erase(t);flag = 1;break;}i++;t++;}if(flag == 0){//如果是一個遞增序列那么的話就要刪除最后一個數 v.erase(t);} } int i = 0;//這么輸出是為了防止前置'0'的輸出for(int i = 0; i < v.size(); i++) {if(v[i] != '0')break; }int j = i; for( ; j < v.size(); j++){cout << v[j];} }四:記錄失敗碼
這是第一次做時寫的碼,測了好多數據,終于測出錯誤了,然后就退出算法有問題了但還是想記錄一下 下方的測試用例可以拿走不謝
/**思路:將輸入的數據當成字符串處理并進行排序,輸出字符串長度-k個字符 */#include<bits/stdc++.h> using namespace std;int main(){int n, k;vector<char>v,v1,v2,v3;int count = 0;cin >> n >> k;;stringstream st;st << n;string str = st.str();for(int i = 0; i < str.size(); i++){v.push_back(str[i]);v2.push_back(str[i]);}sort(v.begin(),v.end());for(int i = 0; i < v.size() - k; i++){v1.push_back(v[i]);}for(int i = 0; i < v2.size(); i++){for(int j = 0; j < v1.size(); j++){if(v2[i] == v1[j] && count < v2.size() - k){v3.push_back(v2[i]);//cout << v2[i]; v1[j] = 'a';//當統計過一次v1容器當中的元素下次就不在輸出了99913 2 count++;break;}}}for(int i = 0; i < v3.size(); i++){int temp = v3[i] - '0'; if(temp != 0)cout << temp;}} //測試用例 //1378541 4//378541 4//1378541 6//11378541 6//11378541 5//378541 4//99913 2//100012 1//這個測試用例推翻算法 正確結果應是 12 上方代碼輸出10001 // 錯誤原因:他存的時候將10001存進去了v1,那么就永遠得不到12總結
以上是生活随笔為你收集整理的7-9 删数问题 (10 分)(思路加详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每顿饭只吃一种食物减肥会对身体有什么影响
- 下一篇: 7-1 银行家算法--安全性检查 (20