1. 程式人生 > >貪心演算法之01字串問題

貪心演算法之01字串問題

“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) ;