poj2549

来源:互联网 发布:pid补偿网络 编辑:程序博客网 时间:2024/06/05 18:30

枚举+二分。首先用两个for循环确定所有a+b的值,然后再用两个for循环确定所有d-c的值,然后枚举a+b的值,二分所有d-c的值,看是否有相等并且符合条件的值,更新保存最大的d值,最后输出。

#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#include<stack>#include<iterator>#include<math.h>#include<stdlib.h>#include<limits.h>#include<map>#include<set>#include<bitset>//#define ONLINE_JUDGE#define eps 1e-6#define INF 0x7fffffff#define FOR(i,a) for((i)=0;i<(a);(i)++)#define MEM(a) (memset((a),0,sizeof(a)))#define sfs(a) scanf("%s",a)#define sf(a) scanf("%d",&a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define pfs(a) printf("%s\n",a)#define sfd(a,b) scanf("%d%d",&a,&b)#define sft(a,b,num) scanf("%d%d%d",&a,&b,&num)#define for1(i,a,b) for(int i=(a);i<b;i++)#define for2(i,a,b) for(int i=(a);i<=b;i++)#define for3(i,a,b)for(int i=(b);i>=a;i--)#define MEM1(a) memset(a,0,sizeof(a))#define MEM2(a) memset(a,-1,sizeof(a))#define ll long longconst double PI=acos(-1.0);template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}template<class T> inline T Min(T a,T b){return a<b?a:b;}template<class T> inline T Max(T a,T b){return a>b?a:b;}using namespace std;//#pragma comment(linker,"/STACK:1024000000,1024000000")int n,m;#define N 210#define M 1000010#define Mod 1000000000#define p(x,y) make_pair(x,y)#define pr pair<ll,int>struct Node{    int sum;    int id1,id2;    bool operator < (const Node &x) const{        return sum<x.sum;    }};vector<Node> v1;vector<Node> v2;int a[1010];bool check(int id1,int id2,int id3,int id4){    if(id1 == id2 || id1 == id3 || id1 == id4)        return false;    if(id2 == id1 || id2 == id3 || id2 == id4)        return false;    if(id3 == id1 || id3 == id2 || id3 == id4)        return false;    if(id4 == id1 || id4 == id2 || id4 == id3)        return false;    return true;}int main(){#ifndef ONLINE_JUDGE    freopen("in.txt", "r", stdin);//  freopen("out.txt", "w", stdout);#endif    while(sf(n)!=EOF&&n){        for(int i=0;i<n;i++)            sf(a[i]);        Node tmp;        v1.clear();        v2.clear();        for(int i=0;i<n;i++){       //循环确定所有a+b的值            for(int j=i+1;j<n;j++){                tmp.sum = a[i]+a[j];                tmp.id1 = i;                tmp.id2 = j;                v1.push_back(tmp);            }        }        for(int i=0;i<n;i++){       //循环确定所有d-c值            for(int j=0;j<n;j++){                if(i == j) continue;                tmp.sum = a[i]-a[j];                tmp.id1 = i;                tmp.id2 = j;                v2.push_back(tmp);            }        }        sort(v1.begin(),v1.end());        sort(v2.begin(),v2.end());  //排序        int size = (int)v1.size();        int size2 = (int)v2.size();        int ans=-INF;        for(int i=0;i<size;i++){            int tmp = v1[i].sum;            int id1 = v1[i].id1;            int id2 = v1[i].id2;            int id = lower_bound(v2.begin(),v2.end(),v1[i])-v2.begin();//二分寻找第一个>=a+b的值            while(id<size2 && v2[id].sum == tmp){ //从第一个>=a+b的值到第一个>a+b的值位置,其中所有都符合a+b+c=d                int id3 = v2[id].id1;                int id4 = v2[id].id2;                if(check(id1,id2,id3,id4)){ //a,b,c,d四个数的id都不相同                    ans = Max(ans,a[id3]);                }                id++;            }        }        if(ans != -INF)            printf("%d\n",ans);        else            printf("no solution\n");    }    return 0;}
0 0