问题 A: 找x
http://codeup.cn/problem.php?cid=100000585&pid=0
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int solve(int left,int right,int x,int a[])
{
int mid;
while(left<=right)
{
mid=(left+right)/2;
if(a[mid]==x)
return mid;
if(a[mid]>x)
{
right=mid-1;
}
else
{
left=mid+1;
}
}
return -1;
}
int main(void)
{
int n;
while(cin>>n)
{
int a[205];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
int x;
cin>>x;
printf("%d\n",solve(0,n-1,x,a));
}
return 0;
}
问题 B: 打印极值点下标
http://codeup.cn/problem.php?cid=100000585&pid=1
思路:
先看第一个和第二个相不相等,不相等就输出下标
看中间部分挨个遍历,如果一个数的左边一个数和右边一个数都不这个数大或小,就输出当前的下标。
然后看最后一个和最后第二个相不相等,不相等就输出下标。
#include<iostream>
#include<cstdio>
using namespace std;
int main(void)
{
int n;
int N;
while( scanf("%d",&n) != EOF)
{
for(int i=0;i<n;i++)
{
cin>>N;
int a[85]={
0};
for(int i=0;i<N;i++)
scanf("%d",&a[i]);
if(a[0]!=a[1])
printf("0 ");
for(int i=1;i<N-1;i++)
{
if( ( a[i]>a[i-1] && a[i]>a[i+1] ) || (a[i]<a[i-1] && a[i+1]>a[i] ) )
{
printf("%d ",i);
}
}
if(a[N-1]!=a[N-2])
printf("%d\n",N-1);
}
}
return 0;
}
问题 C: 查找
http://codeup.cn/problem.php?cid=100000585&pid=2
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
bool flag(int a[],int left,int right,int number)
{
int mid;
while(left<=right)
{
mid=(left+right)/2;
if(a[mid]==number)
return true;
if(a[mid]>number)
{
right=mid-1;
}
else
{
left=mid+1;
}
}
return false;
}
int main(void)
{
int n,m;
int i;
int a[105];
while(cin>>n)
{
for(i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
cin>>m;
for(i=0;i<m;i++)
{
int number;
cin>>number;
if(flag(a,0,n-1,number))
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}