zcmu 1098 查詢元素(二分)
阿新 • • 發佈:2018-12-20
【題目】
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。
注意題目要求四個元素互不相同。
【程式碼】
#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; }
【...】