当前位置: 首页 > news >正文

GCPC总决赛(牛客)

写在前面:

牛客每日一题持续更新中!

今天给亦菲彦祖们带来的是 GCPC总决赛

题目如下:

1.思路分析

第一眼看过去 感觉好像挺难的 其实一点也不简单

前置知识:全排列

题目大意:

  两个学校的队伍进行比赛,告诉我们每个学校的参赛队伍里的“大跌”数量,通过比较每个队伍的大跌数量决定学校胜负。求所有两两匹配的比赛局面中 DarknessCatcher 获胜的情况数,失败的情况数,平局的情况数。

2.题目分析

我们可以对其中某一个学校的参赛队伍的序号进行全排列然后与另外一个学校就行PK然后统计胜负次数。

3.代码实现

C/C++版本:

#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
using ll = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;vector<int> a(n);  // DarknessCatcher队伍的"大跌"数量vector<int> b(n);  // yxkszx队伍的"大跌"数量// 读取DarknessCatcher队伍的"大跌"数量for (int i = 0; i < n; i++)cin >> a[i];// 读取yxkszx队伍的"大跌"数量  for (int i = 0; i < n; i++)cin >> b[i];// 创建排列数组,用于生成所有匹配方式vector<int> p(n, 0);// iota(p.begin(), p.end(), 0); 的等价写法// 初始化p为[0, 1, 2, ..., n-1],表示初始匹配顺序for(int i = 0; i < n; i++)p[i] = i;ll win = 0LL;   // DarknessCatcher获胜的情况数ll lose = 0LL;  // DarknessCatcher失败的情况数  ll draw = 0LL;  // 平局的情况数// 遍历所有可能的排列(即所有匹配方式)// next_permutation会按字典序生成所有排列do {int dark = 0;  // DarknessCatcher得分int yxl = 0;   // yxkszx得分// 计算当前匹配下的双方得分// p数组表示匹配关系:DarknessCatcher的第i队 vs yxkszx的第p[i]队for (int i = 0; i < n; i++) {if (a[i] > b[p[i]])      // DarknessCatcher队伍更强dark++;else if (a[i] < b[p[i]]) // yxkszx队伍更强  yxl++;// 相等则双方都不得分}// 根据得分判断胜负if (dark > yxl)win++;      // DarknessCatcher获胜else if (dark < yxl)lose++;     // DarknessCatcher失败elsedraw++;     // 平局} while (next_permutation(p.begin(), p.end()));  // 生成下一个排列// 输出结果:获胜数 失败数 平局数cout << win << " " << lose << " " << draw << endl;return 0;
}

Python版本:

import itertoolsdef main():n = int(input().strip())# 读取DarknessCatcher队伍的"大跌"数量a = list(map(int, input().split()))# 读取yxkszx队伍的"大跌"数量b = list(map(int, input().split()))win = 0    # DarknessCatcher获胜的情况数lose = 0   # DarknessCatcher失败的情况数draw = 0   # 平局的情况数# 生成所有可能的排列(匹配方式)# 每个排列表示yxkszx队伍的匹配顺序for permutation in itertools.permutations(range(n)):dark_score = 0  # DarknessCatcher得分yxl_score = 0   # yxkszx得分# 计算当前匹配下的双方得分# DarknessCatcher的第i队 vs yxkszx的第permutation[i]队for i in range(n):if a[i] > b[permutation[i]]:dark_score += 1      # DarknessCatcher队伍更强elif a[i] < b[permutation[i]]:yxl_score += 1       # yxkszx队伍更强# 相等则双方都不得分# 根据得分判断胜负if dark_score > yxl_score:win += 1     # DarknessCatcher获胜elif dark_score < yxl_score:lose += 1    # DarknessCatcher失败else:draw += 1    # 平局# 输出结果:获胜数 失败数 平局数print(f"{win} {lose} {draw}")if __name__ == "__main__":main()

Java版本:

import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int[] a = new int[n];  // DarknessCatcher队伍的"大跌"数量int[] b = new int[n];  // yxkszx队伍的"大跌"数量// 读取DarknessCatcher队伍的"大跌"数量for (int i = 0; i < n; i++) {a[i] = scanner.nextInt();}// 读取yxkszx队伍的"大跌"数量for (int i = 0; i < n; i++) {b[i] = scanner.nextInt();}long win = 0;   // DarknessCatcher获胜的情况数long lose = 0;  // DarknessCatcher失败的情况数long draw = 0;  // 平局的情况数// 生成初始排列[0,1,2,...,n-1]List<Integer> indices = new ArrayList<>();for (int i = 0; i < n; i++) {indices.add(i);}// 遍历所有可能的排列(匹配方式)List<List<Integer>> permutations = generatePermutations(indices);for (List<Integer> perm : permutations) {int darkScore = 0;  // DarknessCatcher得分int yxlScore = 0;   // yxkszx得分// 计算当前匹配下的双方得分// DarknessCatcher的第i队 vs yxkszx的第perm.get(i)队for (int i = 0; i < n; i++) {if (a[i] > b[perm.get(i)]) {darkScore++;      // DarknessCatcher队伍更强} else if (a[i] < b[perm.get(i)]) {yxlScore++;       // yxkszx队伍更强}// 相等则双方都不得分}// 根据得分判断胜负if (darkScore > yxlScore) {win++;      // DarknessCatcher获胜} else if (darkScore < yxlScore) {lose++;     // DarknessCatcher失败} else {draw++;     // 平局}}// 输出结果:获胜数 失败数 平局数System.out.println(win + " " + lose + " " + draw);}// 生成所有排列的辅助方法(回溯法)private static List<List<Integer>> generatePermutations(List<Integer> nums) {List<List<Integer>> result = new ArrayList<>();backtrack(result, new ArrayList<>(), nums);return result;}private static void backtrack(List<List<Integer>> result, List<Integer> temp, List<Integer> nums) {// 当临时列表长度等于原列表长度时,找到一个完整排列if (temp.size() == nums.size()) {result.add(new ArrayList<>(temp));return;}// 遍历所有可能的选择for (int i = 0; i < nums.size(); i++) {// 跳过已经选择的元素if (temp.contains(nums.get(i))) continue;// 选择当前元素temp.add(nums.get(i));// 递归处理剩余元素backtrack(result, temp, nums);// 撤销选择(回溯)temp.remove(temp.size() - 1);}}
}

好了,各位码友,代码已经调试通过,文章也已commit,就等各位的push了。点赞不要 //TODO,关注务必 star!

写在后面:

http://www.dtcms.com/a/597686.html

相关文章:

  • 重庆网站优化指导wordpress esc html
  • Java-168 Neo4j CQL 实战:WHERE、DELETE/DETACH、SET、排序与分页
  • 双算法 SSL 证书技术白皮书:SM2+RSA/ECC 混合加密机制深度解析
  • 找别人做的网站怎样修改html代码颜色
  • FPGA教程系列-Vivado IP核FIFO核
  • 大模型-详解 Vision Transformer (ViT) (3)
  • 酒店网站建设的重要性户外家具技术支持东莞网站建设
  • 4G+5G RF静态射频共享的介绍
  • 怎么网站改版想代理个网站建设平台
  • 贝叶斯共识聚类(BCC)
  • Mybatis操作数据库(入门)
  • 高阅读量博文:抓住“痛点”与“热点”/ 高下载量资源:提供“成品”与“利器”
  • css之flex属性
  • 网站建设时间计划广州高端网站设计公司排名
  • 怎么用自己的网站做邮箱wordpress 设计主题
  • 【LlamaIndex】LlamaIndex与Milvus实现知识库
  • 如何查看网站是谁建设的茂名住房和城乡建设厅网站
  • 从图像导数到边缘检测:探索Sobel与Scharr算子的原理与实践
  • vue路由路径加上自动退出登录
  • 推图制作网站无法连接到wordpress
  • Java面试题2:Java线程池原理
  • 小企业网站源码wordpress主题放在那个文件夹
  • HarmonyOS动画性能提升:renderGroup缓存与属性动画优化
  • 玉器企业网站源码wordpress外观小工具
  • kotlin扩展函数是如何实现的
  • 农业科技工作服务站建站模板让网站不要保存密码怎么做
  • 深入学习Redis():Redis内存模型
  • 输出模式下,上下拉电阻不起作用的原因:
  • 如何让PVC制品更安全?稀土抑烟剂助力安全防护
  • Python基础教学-可迭代的(Iterable)和迭代器(iterator)的区别-由Deepseek产生