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