給定五個集合。問是否能從五個集合各取乙個元素,使得元素之和為0.
這道題有兩種做法,一種是雜湊,然而之前沒寫過雜湊.....比賽後從大神那copy了乙份。
這裡說還有一種。
對於這五個集合分為三組。1,2組求和為一組,3,4組求和分為一組,5為一組。
那麼如今轉化為了是否能從前兩組中各取乙個元素。使得這兩個值和為第三組乙個元素的相反數。
那麼對於第一組我們公升序排序。第二組我們降序排序。
對於第三組裡的任一元素,假如第一組隊首加第二組隊首之和大於第三組的元素。那麼第二組游標往後移一位,反之第一組移一位,
那麼這個查詢時間就為o(m),m為陣列元素個數。
那麼總的時間複雜度為o(n*n*n).
#include#include#include#include#include#include#include#include#include#include#include#include#include#define eps 1e-6
#define ll long long
#define pii pairusing namespace std;
//const int maxn = 100 + 5;
//const int inf = 0x3f3f3f3f;
ll s[6][205];
ll s12[200*202], s34[200*202];
int n;
bool check(ll t)
return false;
}int main()
int y1 = 0;
for(int i = 0; i < n; i++)
} int y2 = 0;
for(int i = 0; i < n; i++)
}// cout << y1 << y2 << endl;
sort(s12, s12+n*n);
sort(s34, s34+n*n);
int tag = 0;
for(int i = 0; i < n; i++) if(check(-s[4][i]))
// cout << check(4) << endl;
if(tag) puts("yes");
else puts("no");
} return 0;
}
hdu4334 Trouble (有技巧的暴力)
說一下大概題意 給你5個陣列,每個陣列裡有相同數量的元素,讓你判斷是否能在每個陣列中選取1個元素,使得取完5個數後,相加為0 思路 第一次就是直接寫了五個for語句,然後意料之中超時了。第二次想到了有個叫折半列舉的方法,於是就把5個陣列分為了2和3,用乙個新陣列儲存前兩個陣列相加的所有結果過,再用乙...
HDU 4334 尺取 思維
題意 在5個陣列中,每個陣列中取乙個數,5個數之和是否為0 第一次我是用map標記前3個陣列的和,然後暴力跑後兩個陣列的迴圈,果然t了。網上又兩種做法 處理前三個陣列的和,後兩個陣列的和,排序 列舉 二分。我自己沒試過不知道能過不 t n 3 n 2 log n 3 log n 2 n 2 log ...
hdu1053(哈夫曼編碼)
題意是,給出一排字串,要求求出字元的8位編碼的長度,哈夫曼編碼值,以及之間的比值 因為僅僅只要求求出哈夫曼編碼值,所以不用建立哈夫曼樹,可以建立優先佇列,只要將每次最小的 出隊的兩個元素合成乙個新的大數,然後放進優先佇列中,直到只剩下乙個元素為止,那個元素就是哈夫曼編碼值。注意只有一種字元的情況 a...