算法笔记 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;
}

猜你喜欢

转载自blog.csdn.net/hza419763578/article/details/83117975