二分法和窮舉法

a_streaker發表於2020-10-24

首先,在這裡,
祝全體程式 們——1024,快樂!!!
在這裡插入圖片描述
//請大家忽略水印,

1.分治

在這裡插入圖片描述

  1. 劃分步:把輸入的問題劃分為k個子問題,並儘量使這k個子問題的規模大致相同。
  2. 治理步:當問題的規模大於某個預定的閾值n0時,治理步由k個遞迴呼叫組成。
  3. 組合步:組合步把各個子問題的解組合起來,它對分治演算法的實際效能至關重要,演算法的有效性很大地依賴於組合步的實現。

2.二分法

//二分法
//找中間 (L+R)/2 或 L+(R-L)/2
//偶數,1---mid和mid+1---n 
//奇數,1---mid-1和mid+1---n,遞迴出口如果都沒有找到(兩邊不相等)哪麼mid就是 
//遞迴出口,最後只剩兩個數L+1=R,比大小 
#include<cstdio>
#include<iostream>	
using namespace std;
int findCoin(int coin[],int l,int r){
	int sum1,sum2,mid=(l+r)/2;
	sum1=sum2=0; 
	//迴歸點,只剩下兩個硬幣的情況,返回具體值 
	if(l+1==r){
		return coin[l]<coin[r]?l:r;//三目 
	}
	//不止兩個硬幣的情況,分治求值直到只剩兩個數的情況 
	//n是偶數的情況
	if((r-l+1)%2==0){
		//左邊的和 
		for(int i=1;i<=mid;i++){
			sum1+=coin[i];
		}
		//右邊的和
		for(int i=mid+1;i<=r;i++){
			sum2+=coin[i];
		} 
		if(sum1<sum2){ 
			return findCoin(coin,l,mid);
		}else if(sum1>sum2){
			return findCoin(coin,mid+1,r);
		}
	}else{
		//n為奇數的情況
		//左邊的和 
		for(int i=1;i<=mid-1;i++){
			sum1+=coin[i];
		}
		//右邊的和
		for(int i=mid+1;i<=r;i++){
			sum2+=coin[i];
		} 
		if(sum1<sum2){
			return findCoin(coin,l,mid-1);
		}else if(sum1>sum2){
			return findCoin(coin,mid+1,r);
		}else{
			return mid;
		} 
	}
	return 0;
} 
int a[1000];
int main(void)
{ 
	freopen("CON","r",stdin);
	freopen("CON","w",stdout);
	int n;
	cin>>n;
	//獲取下標 
	for(int i=1;i<=n;i++){
		cin>>a[i];	
	} 
	//找中間的數
	//判斷奇偶性
	//迴圈,找
	//如果沒找到,1.L+1=R,比大小;2.mid
	cout<<findCoin(a,1,n);
	return 0;
} 

3.窮舉法

//二分法,三分法—分治—遞推(開始往後)
//遞迴有出口,f(1)=1,f(2)=1,f(n)=f(n-1)+f(n-2) 
//窮舉法 
#include<cstdio>
#include<iostream>
using namespace std;
int a[1000];
int main(void)
{
	freopen("CON","r",stdin);
	freopen("CON","w",stdout);
	int n;	
	cin>>n;
	//獲取下標 
	for(int i=1;i<=n;i++){
		cin>>a[i];	
	}
	//每兩個比較
	for(int i;i<=n;i+=2){
		if(a[i]<a[i+1]){
			cout<<i;
			return 0;
		}else if(a[i]>a[i+1]){
			cout<<i+1;
			return 0;
		}
	} 
	cout<<n;//如果前面都沒有找到,奇數的情況,只有最後一個 
	return 0;
 } 

謝謝大家
“心想事成無bug” 程式設計師們節日快樂

相關文章