算法筆記 4.5 codeup課後習題 二分

問題 A: 找x

時間限制: 1 Sec  內存限制: 32 MB

題目描述

輸入一個數n,然後輸入n個數值各不相同,再輸入一個值x,輸出這個值在這個數組中的下標(從0開始,若不在數組中則輸出-1)。

輸入

測試數據有多組,輸入n(1<=n<=200),接着輸入n個數,然後輸入x。

輸出

對於每組輸入,請輸出結果。

樣例輸入

4
1 2 3 4
3

樣例輸出

2

實在找不到此題跟二分有什麼關係。。。

代碼:

#include<iostream>
using namespace std;
int main(){
	int n,x;
	int a[210];
	while(cin>>n){
		for(int i=0;i<n;i++){
			cin>>a[i];
		}
		cin>>x;
		bool not_input=true;
		for(int i=0;i<n;i++){
			if(a[i]==x){
				cout<<i<<endl;
				not_input=false;
				break;
			}
		}
		if(not_input) cout<<"-1\n";
	}
	return 0;
}

 

 

問題 B: 打印極值點下標

時間限制: 1 Sec  內存限制: 32 MB
 

題目描述

在一個整數數組上,對於下標爲i的整數,如果它大於所有它相鄰的整數,或者小於所有它相鄰的整數,則稱爲該整數爲一個極值點,極值點的下標就是i。

輸入

每個案例的輸入如下:

有2×n+1行輸入:第一行是要處理的數組的個數n;
對其餘2×n行,第一行是此數組的元素個數k(4<k<80),第二行是k個整數,每兩個整數之間用空格分隔。

輸出

每個案例輸出不多於n行:每行對應於相應數組的所有極值點下標值,下標值之間用空格分隔,如果沒有極值點則不輸出任何東西。

樣例輸入

2
4
1 2 1 3
5
3 4 5 6 7

樣例輸出

0 1 2 3
0 4

本題難點:格式,

1.不能(a[i]-a[i-1])*(a[i]-a[i+a])>0相乘可能溢出

2.格式 千萬注意    開頭結尾不能有多餘的空格

   結尾有換行 若前面沒有輸出,結尾無需換行 

代碼:

#include<iostream>
using namespace std;
int main(){
	int n,m,a[90];
	while(cin>>n){
		while(n--){
			cin>>m;
			for(int i=0;i<m;i++){
				cin>>a[i];
			}
			bool Isinput=false;
			if(a[0]!=a[1]){
				cout<<0;//第一次輸出
				Isinput=true;//萬一第一個不是極值點 格式又錯了
			} 
			for(int i=1;i<m-1;i++){					
				//整數可能很大,相乘溢出  
				//if((a[i]-a[i-1])*(a[i]-a[i+1])>0){
				if(a[i]>a[i-1]&&a[i]>a[i+1]||a[i]<a[i-1]&&a[i]<a[i+1]){
					if(Isinput){
						cout<<" "<<i;//之前至少有過一次輸出 才能 ” i“
					}else{
						Isinput=true;
						cout<<i;//第一次輸出
					}
				}	
			}
			if(a[m-1]!=a[m-2]) cout<<" "<<m-1<<endl;
			else if(Isinput) cout<<endl;
		}
	}
	return 0;
}		

 

 

 

問題 C: 查找

時間限制: 1 Sec  內存限制: 32 MB
提交: 840  解決: 385
[提交][狀態][討論版][命題人:外部導入]

題目描述

輸入數組長度 n 
輸入數組      a[1...n] 
輸入查找個數m 
輸入查找數字b[1...m] 
輸出 YES or NO  查找有則YES 否則NO 。

輸入

輸入有多組數據。
每組輸入n,然後輸入n個整數,再輸入m,然後再輸入m個整數(1<=m<=n<=100)。

輸出

如果在n個數組中輸出YES否則輸出NO。

樣例輸入

6
3 2 5 4 7 8
2
3 6

樣例輸出

YES
NO

爲了和二分扯上關係,硬是排了一下序,時間不知多還是少了

代碼:

#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int a[110],b[110];

bool findB(int x){
	int left=1,right=n;//下標1~n可不能弄混了
	int mid;
	while(left<=right){
		mid=(left+right)/2;
		if(a[mid]==x) return true;
		else if(a[mid]>x) right=mid-1;
		else left=mid+1;
	}
	return false;
}

int main(){
	
	while(cin>>n){
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		cin>>m;
		for(int i=1;i<=m;i++){
			cin>>b[i];
		}
		sort(a+1,a+1+n);
		//"YES"和“NO"要按順序輸出 不能動數組b(不能排序)
		for(int i=1;i<=m;i++){
			if(findB(b[i])){
				cout<<"YES"<<endl;
			}else{
				cout<<"NO"<<endl;
			}
		}

	}
	return 0;
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章