【题目】
1098: 查找元素
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 1416 Solved: 238
[Submit][Status][Web Board]
Description
给定一个整数集合s,对于s里的不同元素a,b,c,d,找出一个最大的d,满足a+b+c=d.
Input
多组测试数据,每组第一行为一个正整数n.(1<=n<=1000)代表集合中元素的个数,第二行为n个整数代表集合里的元素.(每个整数的绝对值小于等于10^8)
Output
对于每组数据如果d存在输出最大的d,否则输出”no solution”.
Sample Input
5
2
3
5
7
12
5
2
16
64
256
1024
Sample Output
12
no solution
【思路】
先将给定元素排序,然后依次选定三个数之和d(从大到小选)和两个加数a,b(从小到大选),二分搜索是否存在c。
注意题目要求四个元素互不相同。
顺便一提STL中的二分函数:
1.binary_search:查找某个元素是否出现。
2.lower_bound:查找第一个大于或等于某个元素的位置。
3.upper_bound:查找第一个大于某个元素的位置。
【代码】
#include <cstdio>
#include <algorithm> //使用sort和binary_search的头文件
using namespace std;
int main()
{
int n;
int s[1010],i,j,k;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++) scanf("%d",&s[i]);
sort(s,s+n); //升序排序
for(i=n-1;i>=0;i--) //和
for(j=0;j<n;j++)
for(k=0;k<n;k++)
if(s[i]!=s[j]&&s[j]!=s[k]&&s[k]!=s[i])
{
int t=s[i]-s[j]-s[k];
if(t!=s[i]&&t!=s[j]&&t!=s[k]&&binary_search(s,s+n,t)) //二分搜索判断是否存在不同于选定三个元素的元素t满足条件
{
printf("%d\n",s[i]);
goto out; //跳出循环
}
}
printf("no solution\n");
out:;
}
return 0;
}
【手写二分】
binary_search(s,s+n,t)改成binary_search(s,n,t)即可
int binary_search(int b[],int n,int x)
{
int left=0,right=n-1,mid;
while(left<=right)
{
mid=(left+right)/2;
if(x==b[mid]&&s[j]!=x&&s[i]!=x&&s[k]!=x)
return 1;
if(x>b[mid]) left=mid+1;
else right=mid-1;
}
return 0;
}
【...】