題目:10125 - Sumsets
題目大意:從給出的數的集合中,找出裡面某個值d,d = a + b+ c;(a,b, c也是屬於這個集合)。要求求最大的d。
階梯思路:把集合裡的數排序,然後d從小到大的嘗試, b + c = d - a。 a的話也從做大的嘗試,這樣能快速找到不符合的,然後 b 和c 從兩頭開始判斷,b取最小的,c去最大的,然後如果版 b + c
> d - a, 說明b要往前移,反之,c 就要往後移。
注意這裡的每個值都有可能成為d,第一個最小的也不例外,因為有負數存在。
#include#include using namespace std; const int N = 1005; int s[N], n; int ans; int find() { for ( int l = n - 1; l >= 0; l--) { for ( int i = n - 1; i > 0; i-- ) { if ( l == i) continue; int sum = s[l] - s[i], j, k; for (j = 0 , k = i - 1; j < k; j++, k-- ) { int temp = s[j] + s[k]; if (temp > sum) j--; else if (temp < sum) k++; else { ans = s[l]; return 1; } } } } return 0; } int main () { while(scanf("%d", &n), n) { for (int i = 0; i < n; i++ ) scanf("%d", &s[i]); sort(s, s + n ); if(find()) printf("%d\n", ans); else printf("no solution\n"); } return 0; }