POJ2549 Sumsets 折半列舉

2021-06-22 21:35:07 字數 1188 閱讀 6369

題目大意是,乙個集合中有n個元素,找出最大的s,滿足條件a+b+c=s,並且這四個數都屬於該集合,n不超過1000.

如果直接列舉o(n^4)顯然複雜度太高,將等式轉化一下a+b=s-c,此時分別對左右兩邊的值進行列舉,這一步複雜度為o(n ^ 2),接著就用二分法查詢滿足該等式的最大s值,

複雜度為o(n^2*log(n))。

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

int values[1001];

struct mystruct

;int compp(const void* a1, const void* a2)

int compp1(const void* a1, const void* a2)

mystruct s[2][1000000];

int main()

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

qsort(values, n, sizeof(int), compp);

int count = 0;

for (int i = n - 1; i >= 0; i--)

}count = 0;

for (int i = n - 1; i >= 0; i--)

}qsort(s[1], count, sizeof(mystruct), compp1);

bool ans = false;

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

int l = 0;

int r = count;

while (r - l > 1)

else

l = mid;

}for (int j = l; j < count;j++)

if (s[0][i].i == s[1][j].i || s[0][i].i == s[1][j].j||

s[0][i].j == s[1][j].i || s[0][i].j == s[1][j].j)

if (s[0][i].res == s[1][j].res)}}

if (!ans)

}return 1;

}

POJ 2549 Sumsets 折半列舉

題意 在集合s中有n個數,找到最大的d,且d滿足於集合內a b c d。題解 我們把找a b c d化為找 a b d c。設c為a,b,c中最大的元素。注意d不一定比c大,d c可以為負數。這樣我們列舉d,c,利用二分的思想查詢a,b。如下 include include include defi...

poj 2549 Sumsets 折半列舉

思路 暴力會超時,就得找個時間小的方法,先變形 a b d c 這樣只列舉d c,用相向搜尋是否存在兩個數a b d c.題中有正有負 所以d也可能是負數 include include include define inf 0x3f3f3f using namespace std int main...

poj2549 Sumsets(中途相遇法)

題目大意 給你一組數字,從數字裡選擇a,b,c,d四個數字 四個數字各不相同 滿足a b c d 題目思路 如果列舉a,b,c得到a b c然後再匹配d的話,複雜度為n 3,這樣就會超時,但是如果分別列舉a b與d c的話這樣時間複雜度就會降到n 2,再進行匹配,還可以進行再進行排序,然後採用二分相...