貪心演算法之01字串問題
阿新 • • 發佈:2018-12-16
“01”子序列問題
問題描述
給定 n 個二進位制字串,要求調整字串順序並連線所有的字元
串,使最後得到的字串中有儘可能多的“01”子序列。輸出“01”子序
列的最大個數。 (1 ≤ n ≤ 100000)。
解題思路與演算法思想
如果用貪心的思路來解這道題,那麼就涉及到一個貪心策略問題
這裡我們不妨把一個子串的含1量作為其唯一的評判標準
那麼其評判標準的計算公式為 這個子串中1的數量/這個子串符號總數
程式模型的建立
- 利用貪心模型
- 每次都選取數量最大的放到最前面
資料結構的選用
- 利用陣列中儲存
程式設計流程
- 輸入
- 計算密度
- 排序
- 貪心
程式設計偽碼演算法
for(all the string) { a,push_back(1的密度) ; } sort(a) ; while(還有字串沒有被選擇) { 把當面位置的這個字串放到最後面 }
源程式編碼清單
#include<iostream> #include<stdio.h> #include<utility> #include<vector> #include<algorithm> using namespace std ; bool comp(pair<int ,double> a ,pair<int ,double> b) ; int main(void) { vector<string>a ; int n ; scanf("%d",&n) ; string tem ; for(int i = 0 ;i<n ;i++) { cin>>tem ; a.push_back(tem) ; } vector<pair<int ,double> > b ; for(int i = 0 ;i<n ;i++) { double sum = 0 ; for(int j = 0 ;j<a[i].size() ;j++) { sum += (a[i][j]-48) ; } sum = sum/(double)a[i].size() ; pair<int ,double > tempair = make_pair(i,sum) ; b.push_back(tempair) ; } sort(b.begin(),b.end(),comp) ; for(int i = 0 ;i<b.size() ;i++) { cout<<a[b[i].first] ; } } bool comp(pair<int ,double> a ,pair<int ,double> b) { if(a.second>b.second) { return true ; } else { return false ; } }
程式輸入、輸出輸入
輸入:
5
1111
1101
0011
1000
輸出:
1111110101100111000
輸入輸出檔案或程式執行結果截圖
時間與空間複雜度分析
- 時間複雜度(n*M) ;