1 条题解

  • 0
    @ 2026-4-7 17:40:17

    一、核心结论(关键突破口)

    先直接给出本题最核心的数学结论,这是标程的灵魂:

    一个集合 SS稳定集合充要条件:集合中任意两个元素 x,yx,y,都满足 2min(x,y)>max(x,y)2 \cdot \min(x,y) > \max(x,y)

    同时延伸出两个必用结论:

    1. 若数组中存在任意一对相邻元素 ai,ai+1a_i, a_{i+1} 满足 2min(ai,ai+1)>max(ai,ai+1)2 \cdot \min(a_i,a_{i+1}) > \max(a_i,a_{i+1}),答案为 YES\text{YES}
    2. 所有相邻元素都不满足这个条件,答案为 NO\text{NO}

    二、严谨证明(为什么标程是对的?)

    1. 稳定集合的定义回顾

    集合 SS 稳定     \iff 对任意 u,v,wSu,v,w \in Su,v,wu,v,w 能构成非退化三角形,即:

    {x+y>zy+z>xz+x>y\begin{cases} x+y>z \\ y+z>x \\ z+x>y \end{cases}

    2. 简化条件:只需检查两个元素

    对一个集合,我们只需要保证最大的数 < 另外两个数的和,三角形条件就全部满足(小数字相加一定更大)。

    要让任意三个数都满足三角形条件,最严苛的情况是:取集合中最大的数 MM,再取两个最小的数 mm。 此时必须满足:

    m+m>Mm + m > M

    也就是:

    2m>M2\cdot m > M

    这个条件等价于:集合中任意两个元素,小的那个的2倍 > 大的那个。 即对任意 x,yx,y

    2min(x,y)>max(x,y)2\cdot \min(x,y) > \max(x,y)

    3. 划分方式的意义

    • 如果存在一对相邻元素满足条件:我们至少有两种划分:
      1. 把这两个元素合并成一个子段;
      2. 把这两个元素分开成两个子段。 因此答案一定是 YES\text{YES}
    • 如果所有相邻元素都不满足条件:每个元素必须单独作为一个子段,只有唯一一种划分,答案是 NO\text{NO}

    三、标程代码逐行解析

    #include <bits/stdc++.h>
     
    #define MAXN 1001
    int a[MAXN];
    void solve() {
    	int n; 
        std::cin >> n;          // 输入数组长度 n
    	for (int i = 1; i <= n; ++i) 
            std::cin >> a[i];   // 输入数组 a[1]~a[n]
        
        // 核心逻辑:遍历所有相邻元素对
    	for (int i = 1; i < n; ++i) 
            // 检查 2*min(a[i],a[i+1]) > max(a[i],a[i+1])
            if (2 * std::min(a[i], a[i + 1]) > std::max(a[i], a[i + 1])) 
    		{ 
                std::cout << "YES\n"; 
                return;         // 找到一对就直接输出 YES
            }
        
        // 所有相邻对都不满足,输出 NO
    	std::cout << "NO\n";
    }
     
    int main() {
    	std::ios::sync_with_stdio(false);
    	std::cin.tie(nullptr), std::cout.tie(nullptr);
    	int t; std::cin >> t; 
        while (t--) solve();   // 处理 t 组测试用例
        return 0;
    }
    

    核心代码逻辑(仅一行判断)

    if (2 * min(a[i], a[i+1]) > max(a[i], a[i+1]))
    
    • 满足     \implies 可以至少两种划分     YES\implies \text{YES}
    • 全部不满足     \implies 只有一种划分     NO\implies \text{NO}

    四、结合样例验证

    样例输入 1

    2
    100000 100000
    

    判断:2min(105,105)=2105>1052\cdot \min(10^5,10^5)=2\cdot 10^5 > 10^5 满足条件     YES\implies \text{YES}

    样例输入 2

    4
    115 9 2 28
    

    相邻对:

    • 115,9115,929=181152\cdot9=18 \not> 115
    • 9,29,222=492\cdot2=4 \not>9
    • 2,282,2822=4282\cdot2=4\not>28

    全部不满足     NO\implies \text{NO}


    五、算法复杂度

    • 时间复杂度:O(n)\mathcal{O}(n) 每组用例,遍历一次数组即可。
    • 空间复杂度:O(n)\mathcal{O}(n),存储数组。
    • 完全适配题目数据范围:t200, n200t\le 200,\ n\le 200

    总结

    1. 核心条件:只要存在一对相邻元素满足 2min(x,y)>max(x,y)2\cdot\min(x,y)>\max(x,y),答案就是 YES\text{YES}
    2. 唯一例外:所有相邻元素都不满足该条件,答案为 NO\text{NO}
    3. 标程本质:线性扫描数组,检查相邻元素对,效率最优、代码极简。
    • 1

    信息

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