力扣 1688. 比赛中的配对次数

本文介绍了一个简单的算法,用于计算锦标赛中直到决出冠军所需的总比赛场次。通过分析每轮比赛后的胜者数量,可以得出结论:无论参赛队伍数量如何,所需的比赛总数总是等于初始队伍数量减一。

题目来源:https://leetcode-cn.com/problems/count-of-matches-in-tournament/

大致题意:
给一个整数 n,表示比赛队伍数。

  • 如果当前参数队伍个数是偶数,则会有 n / 2 场比赛,最终 n / 2 个胜者参与下一轮
  • 如果当前参数队伍个数是奇数,则会有 (n-1) / 2 场比赛,最终 (n-1) / 2 个胜者和 1 个未参与比赛的队伍参与下一轮

求出最后胜者需要的所有比赛场数

思路

共有 n 只队伍,每次比赛淘汰 1 只队伍
最后只剩下 1 只队伍,也就是淘汰 n - 1 只队伍
所以需要 n-1 次比赛

代码:

public int numberOfMatches(int n) {
        return n - 1;
    }
``` // 数字序列比大小 // 题目描述 // A,B两个人玩一个数字比大小的游戏,在游戏前,两个人会拿到相同长度的两个数字序列, // 两个数字序列是不完全相同的,且其中的数字是随机的。 // A,B各自从数字序列中挑选出一个数字进行大小比较,赢的人得1分,输的人扣1分, // 相等则各自的分数不变。用过的数字需要丢弃。 // 求A可能赢B的最大分数 // 输入描述 // 输入数据的第1个数字表示数字序列的长度N,后面紧跟着两个长度为N的数字序列, // 输出描述 // A可能嬴B的最大分数 // 备注 // 1.这里要求计算A可能赢B的最大分数,不妨假设,A知道B的数字序列,且总是B先挑选数字并明示 // 2.可以采用贪心策略,能赢的一定要赢,要输的尽量减少损失。 // 示例1: // 输入 // 3 // 4 8 10 // 3 6 4 // 输出 // 3 // 说明 // 输入数据第1个数字表示数字序列长度为3,后面紧跟着两个长度为3的数字序列。 // 序列A:4 8 10 // 序列B:3 6 4 // A可以赢的最大分数是3。获得该分数的比大小过程可以是: // 1)A: 4 B:3 // 2)A: 8 B:6 // 3)A:10 B:4 #include <functional> #include <iostream> using namespace std; #include <algorithm> #include <vector> // 参考力扣870官解写法,通过16/19 //class Solution { //public: // vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) { // int n = nums1.size(); // vector<int> idx1(n), idx2(n); // iota(idx1.begin(), idx1.end(), 0); // iota(idx2.begin(), idx2.end(), 0); // sort(idx1.begin(), idx1.end(), [&](int i, int j) { return nums1[i] < nums1[j]; }); // sort(idx2.begin(), idx2.end(), [&](int i, int j) { return nums2[i] < nums2[j]; }); // // vector<int> ans(n); // int left = 0, right = n - 1; // for (int i = 0; i < n; ++i) { // if (nums1[idx1[i]] > nums2[idx2[left]]) { // ans[idx2[left]] = nums1[idx1[i]]; // ++left; // } // else { // ans[idx2[right]] = nums1[idx1[i]]; // --right; // } // } // return ans; // } //}; // 2 // 4 2 // 2 3 // 结果应是:1 int main() { // 数字序列的长度 int n; while (cin >> n) { // 注意 while 处理多个 case vector<int> a_nums(n); vector<int> b_nums(n); for (int i = 0; i < n; i++) { cin >> a_nums[i]; } for (int i = 0; i < n; i++) { cin >> b_nums[i]; } // A可能赢B的最大分数 int res = 0; // 排序 sort(a_nums.begin(), a_nums.end()); sort(b_nums.begin(), b_nums.end()); // 2个指针 int b_low = 0; int b_high = n - 1; // 从小到大遍历数组a for (int a_num : a_nums) { if (a_num > b_nums[b_low]) { // a的最小值>b的最小值,胜局+1 res++; b_low++; } else { // a的最小值<=b的最小值,直接用a的最小值匹配b的最大值 if (a_num < b_nums[b_high]) { res--; } b_high--; } } cout << res; } return 0; } // 64 位输出请用 printf("%lld")```为啥按照力扣870的写法不能AC?不都是田忌赛马?
03-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三更鬼

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值