首页 > 其他分享 >1194. 锦标赛优胜者

1194. 锦标赛优胜者

时间:2024-11-16 23:43:47浏览次数:3  
标签:group 锦标赛 1194 player second score 优胜者 id first

目录

题目链接(无VIP请直接看下面的需求)

题目和题目代码

Players 玩家表

+-------------+-------+
| Column Name | Type  |
+-------------+-------+
| player_id   | int   |
| group_id    | int   |
+-------------+-------+
player_id 是此表的主键(具有唯一值的列)。
此表的每一行表示每个玩家的组。
Matches 赛事表

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| match_id      | int     |
| first_player  | int     |
| second_player | int     | 
| first_score   | int     |
| second_score  | int     |
+---------------+---------+
match_id 是此表的主键(具有唯一值的列)。
每一行是一场比赛的记录,first_player 和 second_player 表示该场比赛的球员 ID。
first_score 和 second_score 分别表示 first_player 和 second_player 的得分。
你可以假设,在每一场比赛中,球员都属于同一组。
 

每组的获胜者是在组内累积得分最高的选手。如果平局,player_id 最小 的选手获胜。

编写解决方案来查找每组中的获胜者。

返回的结果表单 没有顺序要求 。

返回结果格式如下所示。

 

示例 1:

输入:
Players 表:
+-----------+------------+
| player_id | group_id   |
+-----------+------------+
| 15        | 1          |
| 25        | 1          |
| 30        | 1          |
| 45        | 1          |
| 10        | 2          |
| 35        | 2          |
| 50        | 2          |
| 20        | 3          |
| 40        | 3          |
+-----------+------------+
Matches 表:
+------------+--------------+---------------+-------------+--------------+
| match_id   | first_player | second_player | first_score | second_score |
+------------+--------------+---------------+-------------+--------------+
| 1          | 15           | 45            | 3           | 0            |
| 2          | 30           | 25            | 1           | 2            |
| 3          | 30           | 15            | 2           | 0            |
| 4          | 40           | 20            | 5           | 2            |
| 5          | 35           | 50            | 1           | 1            |
+------------+--------------+---------------+-------------+--------------+
输出:
+-----------+------------+
| group_id  | player_id  |
+-----------+------------+ 
| 1         | 15         |
| 2         | 35         |
| 3         | 40         |
+-----------+------------+
Create table If Not Exists Players (player_id int, group_id int)
Create table If Not Exists Matches (match_id int, first_player int, second_player int, first_score int, second_score int)

Truncate table Players
insert into Players (player_id, group_id) values ('10', '2')
insert into Players (player_id, group_id) values ('15', '1')
insert into Players (player_id, group_id) values ('20', '3')
insert into Players (player_id, group_id) values ('25', '1')
insert into Players (player_id, group_id) values ('30', '1')
insert into Players (player_id, group_id) values ('35', '2')
insert into Players (player_id, group_id) values ('40', '3')
insert into Players (player_id, group_id) values ('45', '1')
insert into Players (player_id, group_id) values ('50', '2')
Truncate table Matches
insert into Matches (match_id, first_player, second_player, first_score, second_score) values ('1', '15', '45', '3', '0')
insert into Matches (match_id, first_player, second_player, first_score, second_score) values ('2', '30', '25', '1', '2')
insert into Matches (match_id, first_player, second_player, first_score, second_score) values ('3', '30', '15', '2', '0')
insert into Matches (match_id, first_player, second_player, first_score, second_score) values ('4', '40', '20', '5', '2')
insert into Matches (match_id, first_player, second_player, first_score, second_score) values ('5', '35', '50', '1', '1')

1.读题(建议使用这种表结构和数据对比看阅读)

______________________________________________

在这里插入图片描述
每组的获胜者是在组内累积得分最高的选手。如果平局,player_id 最小 的选手获胜。
编写解决方案来查找每组中的获胜者。

2.答案代码以及图表解释

select *from players;    select *from matches;
+---------+--------+    +--------+------------+-------------+-----------+------------+
|player_id|group_id|    |match_id|first_player|second_player|first_score|second_score|
|球员_id(唯一)|组_id |  |匹配_id(唯一)|第一_播放器   |第二_播放器   |第一_分     |第二_分|
+---------+--------+   +--------+------------+-------------+-----------+------------+
|15       |1       |   |1       |15          |45           |3          |0           |
|25       |1       |   |2       |30          |25           |1          |2           |
|30       |1       |   |3       |30          |15           |2          |0           |
|45       |1       |   |4       |40          |20           |5          |2           |
|10       |2       |   |5       |35          |50           |1          |1           |
|35       |2       |   +--------+------------+-------------+-----------+------------+
|50       |2       |每组的获胜者是在组内累积得分最高的选手。如果平局,player_id 最小 的选手获胜。
|20       |3       |  每组   最高  平局  player_id 最小 关键字
|40       |3       |编写解决方案来查找每组中的获胜者。
+---------+--------+;
方法1;
with a1 as (
select first_player 球员_id,first_score 球员_分数 from Matches
union all
select second_player 球员_id,second_score 球员_分数 from Matches)
,a2 as (
select group_id,球员_id,sum(球员_分数) 总分,
       row_number() over (partition by group_id order by sum(球员_分数) desc , 球员_id) rn
from a1
join Players p on p.player_id=a1.球员_id
group by group_id,球员_id)
select group_id,球员_id player_id from a2 where rn=1;
+-----+-----+
|球员_id|球员_分数|
+-----+-----+with a1 as (
|15   |3    |select first_player 球员_id,first_score 球员_分数 from Matches
|30   |1    |union all
|30   |2    |select second_player 球员_id,second_score 球员_分数 from Matches)
|40   |5    |先进行拆分原表,构建新表,在分组聚合,分组排序,取第一行即可
|35   |1    |,a2 as (
|45   |0    |select group_id,球员_id,sum(球员_分数) 总分,
|25   |2    |       row_number() over (partition by group_id order by sum(球员_分数) desc , 球员_id) rn
|15   |0    |from a1
|20   |2    |join Players p on p.player_id=a1.球员_id
|50   |1    |group by group_id,球员_id)
+-----+-----+select group_id,球员_id player_id from a2 where rn=1;
+--------+-----+--+--+
|group_id|球员_id|总分|rn|
+--------+-----+--+--+
|1       |15   |3 |1 |
|1       |30   |3 |2 |
|1       |25   |2 |3 |
|1       |45   |0 |4 |
|2       |35   |1 |1 |
|2       |50   |1 |2 |
|3       |40   |5 |1 |
|3       |20   |2 |2 |
+--------+-----+--+--+
;
方法2;
with a1 as (
    select
         player_id, group_id,
#          sum(if(player_id = first_player, first_score, second_score)) score,
row_number() over(partition by group_id order by
    sum(if(player_id = first_player, first_score, second_score)) desc, player_id) rn
    from players
    join matches
    on player_id = first_player or player_id = second_player
    group by player_id, group_id)
select group_id,player_id from a1 where rn=1;
先进行join既要player_id = first_player又要player_id = second_player,
再对组_id,球员id分组,然后sum(if),这种方法确实有点意想不到,

重点了解,join时,通过on 条件 or 条件 ,能为sum(if)构造分字段sum的条件,
这种思路,还是值得学习的

+---------+--------+--------+------------+-------------+-----------+------------+
|player_id|group_id|match_id|first_player|second_player|first_score|second_score|
+---------+--------+--------+------------+-------------+-----------+------------+
|15       |1       |1       |15          |45           |3          |0           |
|15       |1       |3       |30          |15           |2          |0           |
sum(if(player_id = first_player, first_score, second_score))
|25       |1       |2       |30          |25           |1          |2           |
|30       |1       |2       |30          |25           |1          |2           |
|30       |1       |3       |30          |15           |2          |0           |
|45       |1       |1       |15          |45           |3          |0           |
|35       |2       |5       |35          |50           |1          |1           |
|50       |2       |5       |35          |50           |1          |1           |
|20       |3       |4       |40          |20           |5          |2           |
|40       |3       |4       |40          |20           |5          |2           |
+---------+--------+--------+------------+-------------+-----------+------------+
+---------+--------+-----+--+       +--------+---------+
|player_id|group_id|score|rn|       |group_id|player_id|
+---------+--------+-----+--+       +--------+---------+
|15       |1       |3    |1 |       |1       |15       |
|30       |1       |3    |2 |       |2       |35       |
|25       |1       |2    |3 |       |3       |40       |
|45       |1       |0    |4 |       +--------+---------+
|35       |2       |1    |1 |
|50       |2       |1    |2 |
|40       |3       |5    |1 |
|20       |3       |2    |2 |
+---------+--------+-----+--+

在这里插入图片描述
在这里插入图片描述

标签:group,锦标赛,1194,player,second,score,优胜者,id,first
From: https://blog.csdn.net/weixin_74002941/article/details/143808014

相关文章

  • 洛谷P1194 买礼物之警钟敲爆
    洛谷P1194题解传送锚点摸鱼环节买礼物题目描述又到了一年一度的明明生日了,明明想要买\(B\)样东西,巧的是,这\(B\)样东西价格都是\(A\)元。但是,商店老板说最近有促销活动,也就是:如果你买了第\(I\)样东西,再买第\(J\)样,那么就可以只花\(K_{I,J}\)元,更巧的是,\(K_{I,......
  • SSM泰华超市商品管理系统-计算机毕业设计源码11946
    目 录摘要1绪论1.1研究背景1.2 研究意义1.3论文结构与章节安排2系统分析2.1可行性分析2.2系统流程分析2.2.1数据新增流程3.2.2 数据删除流程2.3 系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4 系统用例分析2.5本章小结3 系......
  • 【日记】原来真的有人不适合谈恋爱(1194 字)
    正文21日正是周五,夏至。全年当中,白天时长最长的一天。而恰好那天也是银行扣息的日子。所以很忙,我差点没能走掉。所幸最终还是有惊无险。到斯的家里,是晚上9点钟。比我想得要早。这个周周四,他过生日。但是那天因为上班,所以移到了周末。不是法定节假日,很普通的一个......
  • L2-047 锦标赛
    这题没做出来,查了一些博客,下面是我比较能接受的一种写法。读完题可以发现这是一个满二叉树,并且可以得到每场比赛失败者的信息(决赛是胜利者和失败者都可以得到)对于一场比赛,它的胜利者要么是左孩子中的胜利者,要么是右孩子中的胜利者,那我们就可以先假设是左孩子的胜利者,如果不行就......
  • 卡尔文球锦标赛
    真实讨厌\(10000\)过\(n^2\)的题目。。。首先这道题目要明白是怎么按照字典序排序的。由于球队都是按照球队里面最小编号的人排序的,我们就从小到大地考虑每个人在哪一支球队。对第\(i\)个人来说,他可以加入之前的一个球队(此时之前要出现过这支球队),也可以新组建一支球队(此时新组建......
  • 2024哈佛-麻省数学竞赛(HMMT)2月锦标赛 团体赛第9题
    [55](题目分数)在一个200*200的网格表的每个单元格上放置一辆汽车,它面向四个基本方向之一。在一步操作中,选择一辆前面没有汽车立即挡住的汽车,并将其向前滑动一个单元格。如果一步操作会导致汽车离开网格,则将该汽车移除。对初始放置方法的要求是,一定存在一系列操作,最终可以将所有汽......
  • P4799 [CEOI2015 Day2] 世界冰球锦标赛
    原题链接题解折半搜索前半部分的所有组合(二进制表示)存起来,然后遍历后半部分的组合,找到第一个加起来不大于M的=code#definelllonglong#include<bits/stdc++.h>usingnamespacestd;inlinevoidread(ll&x){ x=0; llflag=1; charc=getchar();whil......
  • 程序设计天梯赛个人题解 L2-047-2 锦标赛
    题目分析综合题意,将最后一场比赛视为顶层,第一轮比赛视为第一层,则有:下层每场比赛选出一个胜者,每两个下层的胜者间举行本层的一次比赛,显然这是一个二叉树。考虑还原建立每场比赛的树。由于最后一层的比赛是$2^k$个选手参加,故这是个完美二叉树,使用完全二叉树的数组储存方式,则标号......
  • 洛谷题解-P1194 买礼物
    https://www.luogu.com.cn/problem/P1194题目描述又到了一年一度的明明生日了,明明想要买BBB样东西,巧的是,这BBB样东西价格都是AAA元。但是,商店老板说最近有促销活动,也就是:如果你买了第III样东西,再买第JJJ样,那么就可以只花KI,JK_{I,J}KI,J​元,更巧的是,KI,JK_{I,J}K......
  • 数位dp—卡尔文锦标赛
    [CEOI2015Day1]卡尔文球锦标赛题目描述译自CEOI2015Day1T2「Calvinballchampionship」一场卡尔文球比赛会有$n$名选手参与,他们的编号分别为$1\dotsn$,分为若干个非空的球队。我们规定球队之间按照每个球队编号最小的选手的编号排序,并且以从1开始的连续整数编号。举......