1 条题解

  • 1
    @ 2025-3-16 13:31:06
    #include<bits/stdc++.h>
    using namespace std;
    
        // 找出 2 到 1000 之间的所有素数
        for(int i = 2; i <= 1000; i++) {
            if(is_pre(i)) {
                ob[cnt++] = i;
            }
        }
        for(int i = 0; i < n; i++) {
            cin >> a[i];
            int l = 0, r = cnt - 1;
            // 二分查找第一个大于等于 a[i] 的素数的位置
            while(l < r) {
                int mid = (l + r) / 2;
                if(ob[mid] >= a[i]) {
                    r = mid;
                } else {
                    l = mid + 1;
                }
            }
            // 处理边界情况,如果 l 为 0,说明 a[i] 小于第一个素数
            if(l == 0) {
                cout << ob[l] << endl;
            } else {
                // 比较 ob[l] 和 ob[l - 1] 与 a[i] 的距离
                int diff1 = abs(ob[l] - a[i]);
                int diff2 = abs(ob[l - 1] - a[i]);
                if(diff1 < diff2 || diff1 == diff2) {
                    cout << ob[l] << endl;
                } else {
                    cout << ob[l - 1] << endl;
                }
            }
        }
        return 0;
    }
    
    • @ 2025-3-16 13:38:51

      代码太长了,不能发布,所以我省略了试除法判断素数的情况,is_pre是一个bool,判断的函数。这个题我想到的是二分答案,无论是n取多少,它都不会超时,很好的二分答案模版

  • 1

信息

ID
179
时间
3000ms
内存
128MiB
难度
6
标签
(无)
递交数
634
已通过
187
上传者