1 条题解

  • 0
    @ 2025-4-8 14:59:01

    题目分析

    我们需要在给定的整数集合 SS 中,找到最大的元素 dd,使得存在三个互不相同的元素 aa, bb, cSc \in S 满足 a+b+c=da + b + c = d。如果不存在这样的 dd,则输出 no solution

    解题思路

    1. 排序预处理

      • 将集合 SS降序排列,这样我们可以优先检查较大的 dd,确保找到的第一个解就是最大的可能解。
    2. 枚举 ddaa

      • 外层循环枚举可能的 dd(即 SS 中的每个元素)。
      • 内层循环枚举可能的 aa(同样是 SS 中的元素),并计算 t=dat = d - a,即 b+cb + c 的目标值。
    3. 双指针查找 bbcc

      • 对于固定的 ddaa,使用双指针法在剩余元素中查找 bbcc,使得 b+c=tb + c = t
      • 指针初始化:left=j+1left = j + 1right=n1right = n - 1
      • 如果 b+c>tb + c > t,则右指针左移(rightright--)。
      • 如果 b+c<tb + c < t,则左指针右移(left++left++)。
      • 如果 b+c=tb + c = t,检查 dd, aa, bb, cc 是否互不相同。若满足条件,则记录 dd 并退出循环。
    4. 提前终止

      • 一旦找到满足条件的 dd,立即终止所有循环,输出结果。

    关键代码解析

    #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
    上传者