Sumsets UVA

来源:互联网 发布:信用社支票打印软件 编辑:程序博客网 时间:2024/06/03 10:59

题目链接:点击打开链接

题意:给出 n 个数字,找出其中四个使得形成 a+b+c=d 的形式,求出最大的 d ,若不存在,则输出 no solution ;

题解:

         按正常方法四个循环可得出,但肯定超时,所以需要换其他方法,可以先求出d - c 的值,然后按照二分求出 a + b的值,进而得出结果;


#include<iostream>#include<algorithm>#include<cmath>#include<cstdio>#include<cstring>#include<iomanip>using namespace std;int main(){    int n;    while(cin>>n&&n){        int a[1000+100];        for(int i=0;i<n;i++) cin>>a[i];        sort(a,a+n);        int flag=0;        for(int i=n-1;i>=0;i--){            for(int j=n-1;j>=0;j--){                int ans;                if(i!=j)                   ans=a[i]-a[j];                int l=0,r=j-1;                while(l<r){                    if(a[l]+a[r]==ans){                        flag=1; break;                    }                    else if(a[l]+a[r]>ans){                        r--;                    }                    else l++;                }                if(flag) break;            }            if(flag){                cout<<a[i]<<endl;                break;            }        }        if(flag==0) cout<<"no solution"<<endl;    }    return 0;}


原创粉丝点击