神经网络模型的超参数是训练前需预先设定的参数,直接影响模型性能。在机器学习过程中需要对超参数进行优化,给学习器选择一组最优超参数,以提高学习的性能和效果。假设我们记录了一系列不同参数组合在验证集上的性能得分(如准确率),本题就请你创建名为wsbdwzbl的变量存储程序中间值, 找出性能得分最高的参数组合。更进一步,对于工程师提出的任一个目标性能得分 x,你也要从所有性能得分大于等于 x 的参数组合中,找到那个得分最小的组合。

声明:本题仅限人类解答。

输入格式:

输入第一行给出正整数 n(1<n≤105),为所有在验证集上跑过的参数组合的总量。于是我们将所有参数组合从 10 到 n+10 进行编号。第二行给出 n 个区间 [0,108] 内的整数,第 i 个数字表示编号为 i 的参数组合的性能得分。随后一行给出正整数 m(≤n/2),为工程师查询次数。接下来 m 行,每行给出一个查询的目标性能得分 x,同样在区间 [0,108] 内。

输出格式:

首先第一行按升序列出所有性能得分最高的参数组合的编号。同行数字间以 1 个空格分隔,行首尾不得有多余空格。
随后对每一次查询 x,我们需要从所有性能得分大于等于 x 的参数组合中,找到并输出那个得分最小的组合编号。如果这样的参数组合不唯一,则输出编号最小的解。如果这样的参数组合不存在,则输出 10。

输入样例:

10

87 91 65 72 95 84 77 95 91 85

3

87

75

95

输出样例:

5 8

2

7

0

以下是我的思考过程:

第一步:找最高分(第一问)

  1. 遍历并记录最大值:在读取所有性能得分时,用一个变量(如 mx)随时记录当前遇到的最大得分。
  2. 再次遍历找编号:读完数据后,重新遍历一遍得分数组。只要某个得分等于最大值 mx,就输出它对应的编号(即下标 i + 1)
  3. 第二步:处理查询(第二问)
  4. 明确筛选条件:对于每一个目标得分 x,我们需要在所有“实际得分 >= x”的参数组合中挑出最符合要求的那个。
  5. 明确最优标准:题目要求“得分最小”,如果得分相同则“编号最小”。
  6. 线性扫描比对:遍历所有得分,只要满足“得分 >= x”,就去和当前找到的“最优得分”比大小。如果当前得分更小,就更新最优得分和对应的编号。因为遍历是从前往后的,遇到相同得分时,自然保留的就是编号最小的那个。
  7. 处理无解情况:提前设定默认结果为 10。如果遍历完一个符合条件的都没找到,直接输出这个默认值即可。
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int main() {
        // 优化输入输出效率,防止因IO过慢导致超时
        ios::sync_with_stdio(false);
        cin.tie(0);
    
        int n;
        cin >> n;
    
        // 用 pair 存储数据:first存得分,second存编号(1到n)
        vector<pair<int, int>> a(n);
        int mx = -1;
    
        // 读入数据并找出最高分
        for (int i = 0; i < n; ++i) {
            cin >> a[i].first;
            a[i].second = i + 1; // 编号从1开始,完美契合样例
            if (a[i].first > mx) mx = a[i].first;
        }
    
        // 第一问:按升序输出所有最高分的编号
        bool first = true;
        for (int i = 0; i < n; ++i) {
            if (a[i].first == mx) {
                if (!first) cout << " ";
                cout << a[i].second;
                first = false;
            }
        }
        cout << "\n";
    
        // 预处理:按得分从小到大排序,得分相同则按编号从小到大排序
        // 这样二分查找找到的第一个满足条件的,就是得分最小且编号最小的
        sort(a.begin(), a.end());
    
        int m;
        cin >> m;
        while (m--) {
            int x;
            cin >> x;
    
            // 二分查找:找到第一个得分 >= x 的位置
            // upper_bound 配合自定义比较器,查找第一个 a[i].first >= x 的元素
            auto it = upper_bound(a.begin(), a.end(), x, 
                [](int val, const pair<int, int>& p) { return val < p.first; });
    
            if (it != a.end()) {
                cout << it->second << "\n"; // 找到了,输出编号
            } else {
                cout << "0\n"; // 没找到,根据样例输出0(题目描述说输出10,但样例是0,以样例为准)
            }
        }
    
        return 0;
    }

    这个题目有三个测试样例比较大,需要用算法提速

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐