問題 A 賭徒 折半列舉查詢

2021-10-06 05:10:30 字數 1282 閱讀 1700

題目描述

有n個賭徒打算賭一局。規則是:

每人下乙個賭注,賭注為非負整數,且任意兩個賭注都不相同。勝者為賭注恰好是其餘任意三個人的賭注之和的那個人。如果有多個勝者,我們取賭注最大的那個為最終勝者。

例如,a,b,c,d,e分別下賭注為2、3、5、7、12,最終勝者是e,因為12=2+3+7。

輸入輸入包含多組測試資料。每組首先輸入乙個整數n(1<=n<=1000),表示賭徒的個數。

接下來n行每行輸入乙個非負整數b(0<=b<32768),表示每個賭徒下的賭注。

當n=0時,輸入結束。

輸出對於每組輸入,輸出最終勝者的賭注,如果沒有勝者,則輸出no solution。

樣例輸入

5

2 3

5 7 125

2 16

64 256

1024

0

樣例輸出

12

no solution

一種辦法是列舉每個a,b,c,d,四個for,n^4,資料範圍是1000,理論上必超時,但是看到網上的n^4交進去沒有超時,可以知道這個題的資料很水..

思路:a+b+c=d; <——>a+b=d-c;我們先n^2掃一遍用map存下(a+b)的和,再n^2檢視(d-c)是否再map裡,注意一下列舉到和相等的時候每個a,b,c,d是不一樣的。—這題原型是某喜歡養奶牛oj題,那道題的資料範圍更大一點,並且有負數,map的查詢時logn的,總的是n^2logn,可能卡常數.

用基於雜湊表的unordered_map去查詢是o(1)的,總的時間複雜度是o(n^2),可以過。

另外我?力太差,不知道if()裡面的具體怎麼寫…所以貼出這個殘次品

#include#include#include#include#include#includeusing namespace std;

const int maxn=1e5;

typedef long long ll;

ll a[maxn];

struct node

;vectorres;

unordered_map< ll ,vector> mp;

int n;

ll solve()

{ for(ll i=n;i>=1;i--)

{ for(ll j=1;j>a[i];

sort(a+1,a+n+1);

//列舉a

for(ll i=1;i贊

問題 CK 賭徒

有n個賭徒打算賭一局。規則是 每人下乙個賭注,賭注為非負整數,且任意兩個賭注都不相同。勝者為賭注恰好是其餘任意三個人的賭注之和的那個人。如果有多個勝者,我們取賭注最大的那個為最終勝者。例如,a,b,c,d,e分別下賭注為2 3 5 7 12,最終勝者是e,因為12 2 3 7。輸入包含多組測試資料。...

超大揹包問題 折半列舉

超大揹包問題 有重量和價值分別為wi,vi的n個物品,從這些物品中挑選總重量不超過w的物品,求所有挑選方案中價值總和的最大值。1 1 1因為wi,太大,陣列開不了,而我們發現n的數量較少,可以使用折半列舉。首先列舉前n 2個揹包的所有可能結果,儲存在結構體ps n sv ps n sw中,然後按sw...

超大揹包問題(折半列舉)

超大揹包問題 有重量和價值分別為w i v i 的n個物品,從這些物品中選出總重不超過w的物品,求所有挑選方案中價值總和的最大值 1 n 40 1 w i v i 1e15 1 w 1e15 輸入第一行為n,接著輸入一行w i 和一行v i 最後輸入w佔單獨一行 輸出單獨一行即所有挑選方案中價值總和...