1 条题解
-
0
题目分析
我们需要在给定的整数集合 中,找到最大的元素 ,使得存在三个互不相同的元素 , , 满足 。如果不存在这样的 ,则输出
no solution
。解题思路
-
排序预处理:
- 将集合 按降序排列,这样我们可以优先检查较大的 ,确保找到的第一个解就是最大的可能解。
-
枚举 和 :
- 外层循环枚举可能的 (即 中的每个元素)。
- 内层循环枚举可能的 (同样是 中的元素),并计算 ,即 的目标值。
-
双指针查找 和 :
- 对于固定的 和 ,使用双指针法在剩余元素中查找 和 ,使得 。
- 指针初始化:,。
- 如果 ,则右指针左移()。
- 如果 ,则左指针右移()。
- 如果 ,检查 , , , 是否互不相同。若满足条件,则记录 并退出循环。
-
提前终止:
- 一旦找到满足条件的 ,立即终止所有循环,输出结果。
关键代码解析
#include <iostream> #include <cstdio> #include <algorithm> #include <functional> using namespace std; long long da[1020]; int main() { while(1) { int n; scanf("%d",&n); if(n==0) { break; } for(int i=0;i<n;i++) { scanf("%lld",&da[i]); } sort(da,da+n,greater<int>()); int flag=0; int mx; for(int i=0;i<n;i++) { for(int j=0;j<n;j++)// { if(i!=j) { int left=j+1,right=n-1; long long t=da[i]-da[j]; while(left<right) { if(t>da[left]+da[right]) { right--; }else if(t<da[left]+da[right]) { left++; }else { if(i!=left&& i!=right)// { flag=1; mx=da[i]; break; } } } if(flag==1) { break; } } } if(flag==1) { break; } } if(flag==1) { cout<<mx<<endl; }else { cout<<"no solution"<<endl; } } return 0; }
-
- 1
信息
- ID
- 1550
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者