1. 程式人生 > >zcmu 1098 查詢元素(二分)

zcmu 1098 查詢元素(二分)

【題目】

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

7

12

5

2

16

64 

256 

1024

Sample Output

12

no solution 

【思路】

先將給定元素排序,然後依次選定三個數之和d(從大到小選)和兩個加數a,b(從小到大選),二分搜尋是否存在c。

注意題目要求四個元素互不相同。

【程式碼】

#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;
}

【...】