uva10125 - Sumsets

1065 ワード

最も簡単な暴力はタイムアウトします
循環層数や循環回数を減らす方法を考えなければなりません
a+b+c = d
ではa+b=d-c
これは単純な等式変形ではありません
循環の回数が減ったことを意味します
dとcをそれぞれ1サイクル用いて
a+bについては1層のサイクルしか使用しない.
素晴らしい転換でしたが、、、
コードは次のとおりです.
#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
",a[i]); break;} } if(f==0)printf("no solution
"); } return 0; }