程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu4334----多校聯合4

hdu4334----多校聯合4

編輯:C++入門知識

比賽的時候寫hash,一直超時,後來才知道原來我沒把相同的值去掉,就差一點優化我就放棄了,以後還是多想想。

[cpp]
#include<iostream> 
#include<cstdlib> 
#include<stdio.h> 
#include<memory.h> 
#define ll __int64 
#define mm 100007 
using namespace std; 
ll sum[5][210]; 
struct Node 

    ll real; 
}node[40010]; 
int hash[mm],next[40010]; 
int cnt; 
void add(ll key) 

    ll tem=key%mm; 
    if(tem<0) tem+=mm; 
    int i=hash[tem]; 
    while(i!=-1) 
    { 
        if(key==node[i].real) 
        return; 
        i=next[i]; 
    } 
    node[cnt].real=key; 
    next[cnt]=hash[tem]; 
    hash[tem]=cnt++; 
    return ; 

int find(ll tem) 

    ll key=(-tem)%mm; 
    if(key<0) key+=mm; 
    int i=hash[key]; 
    while(i!=-1) 
    { 
        if(node[i].real+tem==0) 
        return 1; 
        i=next[i]; 
    } 
    return 0; 

int main() 

    int t,n; 
    scanf("%d",&t); 
    while(t--) 
    { 
        scanf("%d",&n); 
        for(int i=0;i<5;i++) 
        for(int j=0;j<n;j++) 
        scanf("%I64d",&sum[i][j]); 
        memset(hash,-1,sizeof(hash)); 
        cnt=0; 
        for(int i=0;i<n;i++) 
        for(int j=0;j<n;j++) 
        { 
 
           add(sum[0][i]+sum[1][j]); 
        } 
        bool flag=false; 
        for(int i=0;i<n&&!flag;i++) 
        for(int j=0;j<n&&!flag;j++) 
        for(int k=0;k<n&&!flag;k++) 
        { 
            if(find(sum[2][i]+sum[3][j]+sum[4][k])) 
            { 
                flag=true; 
                break; 
            } 
        } 
        if(flag) 
        cout<<"Yes"<<endl; 
        else 
        cout<<"No"<<endl; 
    } 
    return 0; 


作者:qiqijianglu

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved