
“伟大的勇栗兔栽栗女王,所有栗子看到您都不寒而栗,但也非常尊重您。您骑着威风凛凛的小白兔,带领栗子们奋勇前行。伟大史诗告诉我们,烈兔勇栗从大草原飞奔出来, 冲在每场战争的前线——无论您在哪里,他们都能找到您。骑小白兔飞驰吧,凶猛的女王,但愿您有真正的朋友和软弱的敌人。” 今天,冰雪聪明的栗酱终于玩到了她梦寐很久的文明游戏。 不过作为一个萌新,兔头獐脑的栗酱自然不愿意第一次玩就遇到一个尴尬的结局,于是希望通过你来寻找一个完美结局。 已知游戏结束前场上有n个国家,第i个国家有ai块土地,任意2个国家若是想建立外交关系,则需要互相在对方的一块土地上建立一个大使馆。 一块土地只能建立一个大使馆,若一个国家和其他国家存在外交关系,则需要征用一块己方土地作为备用大使馆。 完美结局的定义是:找到最多数量的国家,使他们相互之间存在外交关系。
第一行一个数T,表示有T组数据。 对于每组数据,第一行输入一个数n,表示国家的数量,接下来一行输入n个数,a1,a2,…,an,其中ai表示第i个国家拥有的土地数量。每两个相邻的数之间用空格隔开。
对于每一个询问,输出一个数,即完美结局下,相互建立外交关系的国家数量。示例1
2
5
2 2 2 2 2
10
8 6 5 9 2 7 10 3 3 92
6对于第一个样例:
最多只能找到2个国家,使他们互相建立外交关系。
对于第二个样例:
第1,2,4,6,7,10个国家间可互相建立外交关系,最多数量为6。 T≤10
1≤n≤1000
1≤ai≤n
tdarr[k] <= k),那么之后的所有元素也不可能满足条件了(因为在降序排列下,后面的元素只会更小)。tdarr[k] > k时,意味着该元素及其之前的元素都满足条件;而一旦出现tdarr[k] <= k的情况,就可以停止计数,因为后续的元素肯定也不满足条件了。#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; // 程序正常结束
}使用了
#include <bits/stdc++.h>和using namespace std;。这种方式虽然可以简化代码编写,但不是最佳实践,尤其是对于大型项目而言。建议根据实际使用的功能导入相应的头文件,并避免使用全局命名空间以防止潜在的名称冲突。
cmp:bool cmp(int &a, int &b) {
return a > b;
}vector中的元素进行降序排序。这个函数接受两个引用参数,并返回true如果第一个参数应该排在第二个之前(即当a > b时)。3.text函数: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,然后初始化一个大小为gj的vector<int>来存储土地数组的数据。cmp对tdarr进行降序排序。tdarr,检查每个元素是否大于其索引位置。如果满足条件,则增加计数器count;如果不满足条件,则立即退出循环,因为后续的元素肯定也不满足条件(由于是降序排列)。4.main函数n,这决定了接下来将处理多少组数据。text函数:通过循环调用text函数处理每一组数据,并将结果输出。int main() {
int n; // 组数
cin >> n; // 从标准输入读取组数n
for (int i = 0; i < n; ++i) {
cout << text() << endl; // 调用text函数处理每组数据,并输出结果
}
return 0;
}