首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[牛客]栗酱的文明2

[牛客]栗酱的文明2

作者头像
@VON
发布2025-12-21 11:51:24
发布2025-12-21 11:51:24
120
举报

题目描述

“伟大的勇栗兔栽栗女王,所有栗子看到您都不寒而栗,但也非常尊重您。您骑着威风凛凛的小白兔,带领栗子们奋勇前行。伟大史诗告诉我们,烈兔勇栗从大草原飞奔出来, 冲在每场战争的前线——无论您在哪里,他们都能找到您。骑小白兔飞驰吧,凶猛的女王,但愿您有真正的朋友和软弱的敌人。” 今天,冰雪聪明的栗酱终于玩到了她梦寐很久的文明游戏。 不过作为一个萌新,兔头獐脑的栗酱自然不愿意第一次玩就遇到一个尴尬的结局,于是希望通过你来寻找一个完美结局。 已知游戏结束前场上有n个国家,第i个国家有ai块土地,任意2个国家若是想建立外交关系,则需要互相在对方的一块土地上建立一个大使馆。 一块土地只能建立一个大使馆,若一个国家和其他国家存在外交关系,则需要征用一块己方土地作为备用大使馆。 完美结局的定义是:找到最多数量的国家,使他们相互之间存在外交关系。

输入描述:

第一行一个数T,表示有T组数据。 对于每组数据,第一行输入一个数n,表示国家的数量,接下来一行输入n个数,a1,a2,…,an,其中ai表示第i个国家拥有的土地数量。每两个相邻的数之间用空格隔开。

输出描述:

代码语言:javascript
复制
对于每一个询问,输出一个数,即完美结局下,相互建立外交关系的国家数量。

示例1

输入

代码语言:javascript
复制
2
5
2 2 2 2 2
10
8 6 5 9 2 7 10 3 3 9

输出

代码语言:javascript
复制
2
6

说明

代码语言:javascript
复制
对于第一个样例:
最多只能找到2个国家,使他们互相建立外交关系。
对于第二个样例:
第1,2,4,6,7,10个国家间可互相建立外交关系,最多数量为6。 

备注:

代码语言:javascript
复制

T≤10

1≤n≤1000

1≤ai≤n

核心逻辑说明:

  • 核心问题是:找到每个组中那些在其排序后的数组中,值大于其索引位置的元素数量。
  • 解决方案:通过先对数组进行降序排序,使得较大的数值排在前面,从而可以简单地通过比较元素与其索引来确定它是否满足条件。因为一旦遇到一个不满足条件的元素(即tdarr[k] <= k),那么之后的所有元素也不可能满足条件了(因为在降序排列下,后面的元素只会更小)。

关键点解析:

  • 降序排序的重要性:降序排序保证了我们可以在遍历过程中,尽早地识别出哪些元素不再满足条件,进而提高算法效率。
  • 索引与值的关系:由于索引从0开始,所以当tdarr[k] > k时,意味着该元素及其之前的元素都满足条件;而一旦出现tdarr[k] <= k的情况,就可以停止计数,因为后续的元素肯定也不满足条件了。
  • 逐组独立处理:每组数据相互独立,因此可以重复使用相同的处理流程来计算每组的结果,只需要确保每次处理前清空或重新初始化相关变量和容器即可。

代码示例

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;

// 定义比较函数,用于降序排序
bool cmp(int &a, int &b) {
    return a > b; // 如果a大于b,则返回true,表示a应该排在b之前
}

// 函数text处理每一组数据,计算并返回满足条件的土地数量
int text() {
    int gj; // 国家数(即每组数据的数量)
    cin >> gj;
    
    vector<int> tdarr(gj); // 初始化一个大小为gj的vector来存储土地数组

    // 输入土地数组的数据
    for (int j = 0; j < gj; ++j) {
        cin >> tdarr[j]; // 从标准输入读取每个国家的土地值,并存入tdarr
    }

    // 对土地数组进行降序排序,以便后续可以更高效地判断条件
    sort(tdarr.begin(), tdarr.end(), cmp);

    int count = 0; // 初始化计数器,用来记录满足条件的土地数量
    
    // 遍历排序后的土地数组,检查每个元素是否满足条件:元素值大于其索引位置
    for (int k = 0; k < gj; ++k) { 
        if (tdarr[k] > k) { // 如果当前元素值大于它的索引,则认为它满足条件
            count++; // 满足条件的土地数量加1
        } else {
            break; // 一旦遇到不满足条件的元素,后面的也不会满足,因此可以提前结束循环
        }
    }

    return count; // 返回该组中满足条件的土地数量
}

int main() {
    int n; // 组数,即有多少组数据需要处理
    cin >> n; // 从标准输入读取组数n

    // 外层循环遍历每一组数据
    for (int i = 0; i < n; ++i) {
        cout << text() << endl; // 调用text函数处理每组数据,并输出结果
    }
    
    return 0; // 程序正常结束
}

代码结构与逻辑分析

1.头文件和命名空间

使用了#include <bits/stdc++.h>using namespace std;。这种方式虽然可以简化代码编写,但不是最佳实践,尤其是对于大型项目而言。建议根据实际使用的功能导入相应的头文件,并避免使用全局命名空间以防止潜在的名称冲突。

2.比较函数 cmp

代码语言:javascript
复制
bool cmp(int &a, int &b) {
    return a > b;
}
  • 定义了一个简单的比较函数用于对vector中的元素进行降序排序。这个函数接受两个引用参数,并返回true如果第一个参数应该排在第二个之前(即当a > b时)。

3.text函数

代码语言:javascript
复制
int text() {
    int gj; // 国家数
    cin >> gj;
    vector<int> tdarr(gj); // 初始化vector

    // 输入土地数组
    for (int j = 0; j < gj; ++j) {
        cin >> tdarr[j];
    }

    // 排序
    sort(tdarr.begin(), tdarr.end(), cmp);

    int count = 0;
    // 计算满足条件的土地数量
    for (int k = 0; k < gj; ++k) { 
        if (tdarr[k] > k) {
            count++;
        } else {
            break; // 一旦遇到不满足条件的元素,后面的也不会满足,因此可以提前结束循环
        }
    }

    return count;
}
  • 输入处理:读取国家数gj,然后初始化一个大小为gjvector<int>来存储土地数组的数据。
  • 数据排序:使用自定义的比较函数cmptdarr进行降序排序。
  • 条件判断与计数:遍历排序后的tdarr,检查每个元素是否大于其索引位置。如果满足条件,则增加计数器count;如果不满足条件,则立即退出循环,因为后续的元素肯定也不满足条件(由于是降序排列)。

4.main函数

  • 输入处理:首先读取测试用例的数量n,这决定了接下来将处理多少组数据。
  • 调用text函数:通过循环调用text函数处理每一组数据,并将结果输出。
代码语言:javascript
复制
int main() {
    int n; // 组数
    cin >> n; // 从标准输入读取组数n

    for (int i = 0; i < n; ++i) {
        cout << text() << endl; // 调用text函数处理每组数据,并输出结果
    }
    
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
    • 输入描述:
    • 输出描述:
    • 输入
    • 输出
    • 说明
    • 备注:
  • 核心逻辑说明:
  • 关键点解析:
  • 代码示例
  • 代码结构与逻辑分析
    • 1.头文件和命名空间:
    • 2.比较函数 cmp:
    • 3.text函数:
    • 4.main函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档