uva10125 - Sumsets
最简单的暴力 会超时
所以我们要想方设法的减少循环层数或者循环次数,
a+b+c = d
那么a+b=d-c
这不是简单的等式变形
而是意味着我们循环的次数减少了。
我们对于d和c分别用一层循环,
对于a+b只用一层循环。
很妙的转变,,,
代码如下:
#include <cstdio> #include <algorithm> using namespace std; int a[1010]; int main () { int n; while(scanf("%d",&n),n) { for(int i = 0; i < n; i++) scanf("%d",&a[i]); sort(a,a+n); int f = 0; for(int i = n-1; i >= 0; i--) { for(int j = n-1; j >= 0; j--) if(i!=j) { int t = a[i]-a[j]; for(int l = 0, k = j-1; l<k;) { if(a[l]+a[k]==t) {f = 1; break;} else if(a[l]+a[k]>t) k--; else l++; } if(f) break; } if(f) {printf("%d\n",a[i]); break;} } if(f==0)printf("no solution\n"); } return 0; }