64,636
社区成员
发帖
与我相关
我的任务
分享
#include <algorithm>
#include <cstdio>
#include <vector>
#include <string>
using namespace std;
template <class S,class R>
void combination(S &source,int n,int m,R &result);
int main()
{
int n,value;
bool flag;
vector< vector<int> > result;
while(scanf("%d", &n), n)//表达式中,如果有逗号,以逗号后的值为返回值。即输入一个n并返回n的值。
{
flag=false;
vector<int> source(n,0);
result.clear();
for(int i = 0; i < n; i++)
scanf("%d", &source[i]);
combination(source,n,3,result);//得到组合,并且都已经从小到大排序.
for(vector< vector<int> >::reverse_iterator it=result.rbegin();it!=result.rend();++it){
value=(*it)[2]-(*it)[1]-(*it)[0];//最大的数减去其他两个数,得到另一个数
//如果这个数不同于这个组合内的数并且在给出的数组中
if(value!=(*it)[0]&&value!=(*it)[1]&&value!=(*it)[2]&&binary_search(source.begin(),source.end(),value))
{
printf("%d\n",(*it)[2]);//输出
flag=true;
break;
}
}
if(flag != true)
printf("no solution\n");
}
return 0;
}
template <class S,class R> inline
void combination(S &source,int n,int m,R &result){
bool binary_Array[n];//创建布尔数组
S t(m,NULL);
int index,j=0;
for (index=0;index<m;index++) binary_Array[index]=true;//创建一个新组合,选中的数置为1
for (index=m;index<n;index++) binary_Array[index]=false;//没被选中的数置为0
//保存初始组合
for (index=0;index!=n;index++){
if (binary_Array[index]==true) t[j++]=source[index];
}
result.push_back(t);
while(true){
//开始寻找10。如果找到就跳出循环
for (index=0;index<n-1;index++)
if (binary_Array[index]==true&&binary_Array[index+1]==false) break;
if (index==n-1) return; //没有找到10就结束程序
//把10变成01
binary_Array[index]=false;
binary_Array[index+1]=true;
int p=0;//从左向右寻找零标志位用的索引
//10变成01后,把i左边的1标志位全部移动到最左边
while (p<index){
while (binary_Array[p]==true) p++;//从左向右寻找0标志位,如果找到就向下执行
while (binary_Array[index]==false) index--;//从右向左寻找1标志位,如果找到就向下执行
//如果左边有零标志位,就与右边的1标志位进行交换
if (p<index) {
binary_Array[p]=true;
binary_Array[index]=false;
}
}
//保存组合
j=0;
for (index=0;index!=n;index++){
if (binary_Array[index]==true) t[j++]=source[index];
}
result.push_back(t);
}
}
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int main()
{
int n, i, j, k, value, flag = 1;
while(scanf("%d", &n), n)
{
flag = 1;
int a[n];
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
sort(a, a+n);
for(i = n-1; i >= 0; i--)
{
for(j = 0; j < n; j++)
{
for(k = 0; k < n; k++)
{
if(i!=j && j!=k && i!=k)
{
value = a[i] - a[j] - a[k];
if(value!=a[i]&&value!=a[j]&&value!=a[k]&&binary_search(a,a+n,value))
{
printf("%d\n", a[i]);
flag = 0;
break;
}
}
if(flag == 0) break;
} if(flag == 0) break;
} if(flag == 0) break;
}
if(flag == 1)
printf("no solution\n");
}
return 0;
}