题目链接:http://acm.uestc.edu.cn/#/problem/show/1262
思路:因为要能找出来2个瓶子,所以说所求出来的组合中两两相加的和不能有重复的,所以说问题就转换成了寻找一个序列,这个序列中两两相的
和不会重复,直接暴力求,枚举序列中所需要的数,然后检查标记
ac代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stack>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#define MAXN 1010000
#define LL long long
#define ll __int64
#define INF 0xfffffff
#define mem(x) memset(x,0,sizeof(x))
#define PI acos(-1)
#define mod 1000000007
using namespace std;
int a[MAXN];
int sum[MAXN];
int v[MAXN];
int check(LL x,int n)
{
mem(v);
int cnt=0;
int bz=0;
for(int i=1;i<=n;i++)
{
sum[cnt]=x+a[i];
v[sum[cnt]]=1;
cnt++;
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
sum[cnt]=a[i]+a[j];
if(v[sum[cnt]])
{
bz=1;
break;
}
else
v[sum[cnt]]=1;
cnt++;
}
if(bz)
break;
}
if(bz)
return 0;
else
return 1;
}
int main()
{
int n,j;
while(scanf("%d",&n)!=EOF)
{
if(n==2)
{
printf("1 1\n");
continue;
}
a[1]=1;a[2]=2;a[3]=3;
n-=3;
int num=3;
printf("1 2 3");
for(LL i=5;n>0;i++)
{
if(check(i,num))
{
printf(" %d",i);
a[++num]=i;
n--;
}
}
printf("\n");
}
return 0;
}