程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 4334 Trouble 排序+優化 多校聯合賽(四)第四題

hdu 4334 Trouble 排序+優化 多校聯合賽(四)第四題

編輯:C++入門知識

五行數,分別為a1,a2,a3,a4,a5,先將a1與a2相加和成新的一行s1,將a3與a4相加和成新的一行s2,對s1,s2,從達到小排序,時間復雜都一共為n^2+n^2+nlogn+nlogn
設x為s1的頭,y為s2的尾,然後對每一個a5進行比較,如果(s1[x]+s2[y]+a5[i]<0) x++;  else if((a[x]+b[y]+c[i])>0) y--;  時間復雜都為n^3,其實這樣做快是因為排序後避免的很多沒有必要的比較
[cpp] 
#include<iostream> 
#include<cstdio> 
#include<algorithm> 
using namespace std; 
#define N 205 
__int64 a[N*N],b[N*N],c[N]; 
int main(){ 
    __int64 t,n,x,y; 
    scanf("%I64d",&t); 
    while(t--){ 
        int cou=0; 
        scanf("%I64d",&n); 
        for(int i=0;i<n;i++) 
            scanf("%I64d",&c[i]); 
        for(int i=0;i<n;i++){ 
            scanf("%I64d",&x); 
            for(int j=0;j<n;j++){ 
                a[cou++]=x+c[j]; 
            } 
        } 
        cou=0; 
        for(int i=0;i<n;i++) 
            scanf("%I64d",&c[i]); 
        for(int i=0;i<n;i++){ 
            scanf("%I64d",&x); 
            for(int j=0;j<n;j++){ 
                b[cou++]=x+c[j]; 
            } 
        } 
        for(int i=0;i<n;i++) 
            scanf("%I64d",&c[i]); 
        sort(a,a+cou); 
        sort(b,b+cou); 
//        cout<<"***"<<endl; 
        int flag=0; 
        for(int i=0;i<n;i++){ 
            x=0;y=cou-1; 
            while(x<cou&&y>=0){ 
                if(a[x]+b[y]+c[i]<0) x++; 
                else if((a[x]+b[y]+c[i])>0) y--; 
                else { 
                    flag=1; 
                    break; 
                } 
            } 
            if(flag==1) 
                break; 
        } 
        if(flag) printf("Yes\n"); 
        else printf("No\n"); 
    } 

作者:youngyangyang04

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