UVa10125 Sumsets 折半搜尋

2021-07-06 01:15:21 字數 796 閱讀 8341

題目大意:給出n個數字,求滿足a+b+c=d最大的d

分析:先將等式變形為a+b=d-c,然後找出所有可能的a+b的值以及d-c的值,接著就直接匹配就行了。

**:

#include #include #include #include #include using namespace std;

const int maxn = 1111;

struct c

};vectorc, m;

vectorq;

int p[maxn];

int main()

int cnt1 = 0, cnt2 = 0;

c.clear();

m.clear();

q.clear();

for(int i = 0; i < n; i++) );

cnt1++;}}

for(int i = 0; i < n; i++) );

cnt2++;}}

int ans = 0;

int flag = 0;

sort(m.begin(), m.begin()+cnt2);

for(int i = 0; i < cnt2; i++)

q.push_back(m[i].sum);

for(int i = 0; i < cnt1; i++) }}

if(flag) printf("%d\n", ans);

else printf("no solution\n");

}return 0;

}

UVA 10125 Sumsets(二分查詢)

given s,a set of integers,find the largest d such that a b c d where a,b,c,and d are distinct elements of s.several s,each consisting of a line contai...

10125 Sumsets(折半列舉 二分)

該題和挑戰上一道題很類似,如果列舉四個值的話,複雜度太高。那麼我們可以想辦法將複雜度分開。方法是 先用o n 2 預處理出來a b,然後列舉c和d,二分查詢ab中有沒有恰好等於d c的值。細節參見 includeusing namespace std typedef long long ll con...

高效演算法設計專項 UVa 10125

暴力列舉顯然會tle。lrj書裡介紹了中途相遇法,用map實現了一下,就是先用o n 2 建立乙個a b到乙個整數的對映,然後再用o n 2 列舉d c就可以在o n 2 複雜度下解決該問題了。需要注意的是a b c d不能重複,這裡我用map 實現以判重。只不過具體 比較醜 include inc...