欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > GESP2023年9月认证C++六级( 第三部分编程题(2)小杨的握手问题)

GESP2023年9月认证C++六级( 第三部分编程题(2)小杨的握手问题)

2025/2/4 20:38:45 来源:https://blog.csdn.net/weixin_60445850/article/details/145432720  浏览:    关键词:GESP2023年9月认证C++六级( 第三部分编程题(2)小杨的握手问题)

参考程序1(暴力枚举)

#include <iostream>
using namespace std;int main() {int n = 0;cin >> n;  // 读入同学的数量int num[300000];  // 存储同学的学号for (int i = 0; i < n; i++) {cin >> num[i];  // 读入同学的进入顺序}long long handshakes = 0;  // 用来存储总握手次数// 暴力枚举:对每个同学,检查和之前已经进入的同学是否构成握手for (int i = 1; i < n; i++) {  // 从第二个同学开始for (int j = 0; j < i; j++) {  // 遍历当前同学之前已经进入的同学if (num[i] > num[j]) {  // 如果当前同学的学号小于已经在教室的同学handshakes++;  // 这两个同学会握手}}}cout << handshakes << endl;  // 输出握手的总次数return 0;
}

参考程序2(归并排序---逆序对):

#include <iostream>
using namespace std;int num[300000];  // 存储同学的学号
int tmp[300000];  // 临时数组,用来辅助归并排序// 归并排序的修改版,用来计算逆序对
long long merge(int l, int r) {if (l + 1 == r)  // 如果区间只包含一个元素,则没有逆序对return 0;int m = (l + r) / 2;  // 找到中点long long res = merge(l, m) + merge(m, r);  // 分治:递归计算左右两部分的逆序对for (int i = l, j = m, k = l; k < r; k++) {if (j == r || (i < m && num[i] > num[j])) {tmp[k] = num[i];  // 如果左边元素小于右边元素,或右边元素已经处理完,则将左边元素放入临时数组i++;} else {tmp[k] = num[j];  // 否则将右边元素放入临时数组j++;res += m - i;  // 统计逆序对:如果左边元素大于右边元素,那么左边剩余的所有元素都与右边当前元素构成逆序对}}// 将临时数组的数据拷贝回原数组for (int k = l; k < r; k++)num[k] = tmp[k];return res;  // 返回当前区间的逆序对数
}int main() {int n = 0;cin >> n;  // 读入同学的数量for (int i = 0; i < n; i++)  // 读入同学进入教室的顺序cin >> num[i];cout << merge(0, n) << endl;  // 计算并输出总的握手次数(即逆序对数)return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com