hdu4334 Trouble (有技巧的暴力)

2021-08-14 22:12:46 字數 1325 閱讀 5183

說一下大概題意:給你5個陣列,每個陣列裡有相同數量的元素,讓你判斷是否能在每個陣列中選取1個元素,使得取完5個數後,相加為0

思路:第一次就是直接寫了五個for語句,然後意料之中超時了。

第二次想到了有個叫折半列舉的方法,於是就把5個陣列分為了2和3,用乙個新陣列儲存前兩個陣列相加的所有結果過,再用乙個新陣列儲存後三個的結果,最後再列舉相加,然後還是超時了。

第三次就想到了可能是有過多的重複資料,於是多了一步去重操作,還是超時了(後話,這題資料相加結果中重複資料不是特別多)

第四次想到到了使用logn複雜度的二分搜尋,列舉2個陣列相加的結果,然後二分搜尋3個陣列相加結果中是否有符合題意的解。然後還是超時了。

然後想到了既然把5個陣列分為2個和3個行不通,就只能再次細分為1 2 2.這樣的話就用到了乙個小技巧,然後就ac了,太艱難了。

事實上考慮如下問題,快速求解序列a,序列b中,是否有ai+bj=x ,記得是某知名公司的一道面試題吧,是兩個指標的應用,將a,b公升序排列,初試 i 指標指向a[1] ,j 指標指向 b[b_size] ,比較ai + bj 與 x 的大小。 若a[i]+b[j] < x , i 指標右移 ; 若 a[i]+b[j]>x , j 指標左移 。事實上是乙個貪心的思想。(**網路)

#include

#include

#include

typedef

long

long ll;

using

namespace

std;

ll a[5][205];

ll sum[40005];

ll sum1[40005];

int main()

}for(int i=0; ifor(int j=0; j0][i]+a[1][j];}}

for(int i=0; ifor(int j=0; j2][i]+a[3][j];}}

sort(sum,sum+p);//記得要排序

sort(sum1,sum1+q);

for(int k=0; kint i=0;//讓sum陣列從左到右

int j=p-1;//讓sum1陣列從右到左

while(j>=0&&i<=p-1)//判斷結束條件

else

if(temp+a[4][k]>0)

else

}if(flag) break;

}if(flag) printf("yes\n");

else

printf("no\n");

}return

0;}

HDU 4334 Trouble(雜湊 線性查詢)

給定五個集合。問是否能從五個集合各取乙個元素,使得元素之和為0.這道題有兩種做法,一種是雜湊,然而之前沒寫過雜湊.比賽後從大神那copy了乙份。這裡說還有一種。對於這五個集合分為三組。1,2組求和為一組,3,4組求和分為一組,5為一組。那麼如今轉化為了是否能從前兩組中各取乙個元素。使得這兩個值和為第...

HDU 4334 尺取 思維

題意 在5個陣列中,每個陣列中取乙個數,5個數之和是否為0 第一次我是用map標記前3個陣列的和,然後暴力跑後兩個陣列的迴圈,果然t了。網上又兩種做法 處理前三個陣列的和,後兩個陣列的和,排序 列舉 二分。我自己沒試過不知道能過不 t n 3 n 2 log n 3 log n 2 n 2 log ...

hdu 2076 夾角有多大

problem description 時間過的好快,乙個學期就這麼的過去了,xhd在傻傻的看著表,出於對資料的渴望,突然他想知道這個表的時針和分針的夾角是多少。現在xhd知道的只有時間,請你幫他算出這個夾角。注 夾角的範圍 0,180 時針和分針的轉動是連續而不是離散的。input 輸入資料的第一...