1 条题解

  • 0
    @ 2026-1-29 22:28:10
    #include<bits/stdc++.h>
    using namespace std;
    // arr-存储所有抽奖数字,数组大小适配n≤1000的限制
    int arr[1010];
    
    int main() {
        // [1] 读取抽奖人数n
        int n;
        cin >> n;
        
        // [2] 读取n个互不相同的抽奖数字
        for (int i = 0; i < n; i++) {
            cin >> arr[i];
        }
        
        // [3] 对数组升序排序,便于后续从大到小检查+双指针找三数之和
        sort(arr, arr + n);
        
        // [4] 从最大的数字开始检查(确保找到的第一个符合条件的数就是最大的中奖数)
        for (int i = n - 1; i >= 3; i--) {
            int target = arr[i]; // 当前检查的数字,作为三数之和的目标值
            // 在0~i-1的范围内找三个不同的数,使其和等于target
            for (int j = 0; j < i - 2; j++) {
                int k = j + 1; // 左指针
                int l = i - 1; // 右指针
                while (k < l) {
                    int sum = arr[j] + arr[k] + arr[l];
                    if (sum == target) {
                        // 找到符合条件的最大数,直接输出并结束程序
                        cout << target << endl;
                        return 0;
                    } else if (sum < target) {
                        k++; // 和太小,左指针右移增大和
                    } else {
                        l--; // 和太大,右指针左移减小和
                    }
                }
            }
        }
        
        // [5] 遍历完所有数字都未找到符合条件的数,输出no
        cout << "no" << endl;
        
        return 0;
    }
    
    • 1

    信息

    ID
    1166
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    1
    已通过
    1
    上传者