hdu 4334 Trouble

有5个数列,将第一,二列合并去重得到s1,再将第三,四列合并去重得到s2,这样就剩下3列了。

然后将s1,s2排序,枚举第5列,每次用x指向s1的头,y指向s2的尾,当取出的3个和恰好为0则退出;

大于0时y--;否则x++!

代码如下:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#define ll __int64
#define pi acos(-1.0)
#define MAX 50000
using namespace std;
ll a[202],b[202],c[40002],d[40002];
vector<ll>s1,s2;
int main(){
    int t,n,m,i,j,k;
    cin>>t;
    while(t--){
        scanf("%d",&n);
        s1.clear();
        s2.clear();
        for(i=0;i<n;i++) scanf("%I64d",&a[i]);
        for(i=0;i<n;i++) scanf("%I64d",&b[i]);
        for(i=0;i<n;i++)
        for(j=0;j<n;j++){
            s1.push_back(a[i]+b[j]);
        }
        for(i=0;i<n;i++) scanf("%I64d",&a[i]);
        for(i=0;i<n;i++) scanf("%I64d",&b[i]);
        for(i=0;i<n;i++)
        for(j=0;j<n;j++){
            s2.push_back(a[i]+b[j]);
        }
        sort(s1.begin(),s1.end());
        sort(s2.begin(),s2.end());
        c[0]=s1[0];
        for(i=1,j=1;i<s1.size();i++){
            if(s1[i]!=s1[i-1])
                c[j++]=s1[i];
        }
        d[0]=s2[0];
        for(i=1,k=1;i<s2.size();i++){
            if(s2[i]!=s2[i-1])
                d[k++]=s2[i];
        }
        for(i=0;i<n;i++) scanf("%I64d",&a[i]);
        bool flag=0;
        for(i=n-1;i>=0;i--){
            int x=0;
            int y=k-1;
            while(x<j&&y>=0){
                ll temp=c[x]+d[y]+a[i];
                if(temp==0){
                    flag=1;
                    break;
                }
                if(temp>0) y--;
                else x++;
            }
            if(flag) break;
        }
        if(flag) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/xin-hua/p/3230051.html