问题 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;
}