🏆今日学习目标:
🍀例题讲解1551:Sumsets
✅创作者:贤鱼
⏰预计时间:25分钟
🎉个人主页:贤鱼的个人主页
🔥专栏系列:c++
🍁贤鱼的个人社区,欢迎你的加入 贤鱼摆烂团
1551:Sumsets
- 题目
- 思路
- AC代码
题目
描述
Given S, a set of integers, find the largest d such that a + b + c = d where a, b, c, and d are distinct elements of S.
输入
Several S, each consisting of a line containing an integer 1 <= n <= 1000 indicating the number of elements in S, followed by the elements of S, one per line. Each element of S is a distinct integer between -536870912 and +536870911 inclusive. The last line of input contains 0.
输出
For each S, a single line containing d, or a single line containing “no solution”.
样例输入
5
2
3
5
7
12
5
2
16
64
256
1024
0
样例输出
12
no solution
思路
我们首先排序
没毛病吧
大的数字必须是小的相加(注意负数)
看这个数据范围,用vis数组判断数字是否存在一看就不显示,必re
我们可以枚举数字d和c
定义nm等于d-c,利用二分寻找剩余答案
注意我们除了输入的数字,数组内其他记得保持为0
我们枚举数字d的时候记得从d+1开始
这是个问题
如果不从数字数量+1
开始数字0无法处理
例如3 1 0 -1 -2
这个数字一看就是0=3+(-1)+(-2)
但是我们到0了,第二层循环是i-1到1,哪里还枚举的到3??
所以我们从数字数+1
开始处理相当于提前处理0
如果有其他想法欢迎私信噢~
AC代码
#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int s;
int n[1005];
int main(){
while(1){
memset(n,0,sizeof(n));
cin>>s;
if(s==0){
return 0;
}
for(int i=1;i<=s;i++){
cin>>n[i];
}
int f=0;
sort(n+1,n+s+1);
for(int i=s+1;i>=1;i--){
for(int j=i-1;j>=1;j--){
int nm=n[i]-n[j];
int l=1,r=j-1;
while(l<r){
if(n[l]+n[r]==nm){
f=1;
cout<<n[i]<<endl;
goto js;
}
else if(n[l]+n[r]<nm){
l++;
}else{
r--;
}
}
}
}
js:
if(!f)
cout<<"no solution"<<endl;
}
}