Content

有 \(n\) 场已经进行完的赛车比赛,每场比赛给出前 \(m\) 名的名字。在每场比赛中,前 \(10\) 名的选手分别可以获得 \(25,18,15,12,10,8,6,4,2,1\) 分,其他名次的选手不得分。现在给出两种排序方式:

  1. 先按照得分降序排序,如果得分相同,按照得到第一名的次数降序排序,如果还是相同,就按照得到第二名的次数降序排序,以此类推,直到比较出来为止。
  2. 先按照得到第一名的次数降序排序,如果次数相同,按照得分降序排序,如果还是相同,就按照得到第二名的次数降序排序,以此类推,直到比较出来为止。

请求出按照两种排序方式排序之后分别得出来的第一名。

数据范围:\(1\leqslant n\leqslant 20,1\leqslant m\leqslant 50\)。

Solution

结构体排序好题。

我们开个结构体,把每个人的名字、得分以及得到的名次的次数情况储存下来:

struct player {
string name;
int score, ranking[57];
}a[1007], b[1007];

然后就是如何通过输入储存了,我们还是利用 \(\texttt{map}\) 将每个人的名字映射到其编号上,每出现一个新的名字,就新开一个空间来存储,并统计这个人的分数和排名情况。

那么为什么要开两组结构体呢?这样好方便排序,所以我们再复制一组相同的结构体,然后按照上面的两个排序方式排序即可,可以写两个 \(\texttt{cmp}\) 函数,然后直接按照上面的方式模拟即可。

Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#include <map>
using namespace std; const int getscore[51] = {0, 25, 18, 15, 12, 10, 8, 6, 4, 2, 1};
map<string, int> vis;
int n, cnt;
string names;
struct player {
string name;
int score, ranking[57];
}a[1007], b[1007]; bool cmp1(const player& p1, const player& p2) {
if(p1.score != p2.score) return p1.score > p2.score;
else
for(int i = 1; i <= 50; ++i)
if(p1.ranking[i] != p2.ranking[i]) return p1.ranking[i] > p2.ranking[i];
}
bool cmp2(const player& p1, const player& p2) {
if(p1.ranking[1] != p2.ranking[1]) return p1.ranking[1] > p2.ranking[1];
else if(p1.score != p2.score) return p1.score > p2.score;
else
for(int i = 2; i <= 50; ++i)
if(p1.ranking[i] != p2.ranking[i]) return p1.ranking[i] > p2.ranking[i];
} int main() {
scanf("%d", &n);
while(n--) {
int m;
scanf("%d", &m);
for(int i = 1; i <= n; ++i) {
cin >> names;
if(!vis[names]) {
vis[names] = ++cnt;
a[vis[names]].name = names;
}
a[vis[names]].score += getscore[i];
a[vis[names]].ranking[i]++;
}
}
for(int i = 1; i <= cnt; ++i) b[i] = a[i];
sort(a + 1, a + cnt + 1, cmp1);
sort(b + 1, b + cnt + 1, cmp2);
cout << a[1].name << endl << b[1].name;
return 0;
}

CF24B F1 Champions 题解的更多相关文章

  1. CodeForces 24B F1 Champions(排序)

    B. F1 Champions time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  2. 24B F1 Champions

    传送门 题目 Formula One championship consists of series of races called Grand Prix. After every race driv ...

  3. hdu-4893

    http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意: 给定一个数组a,一开始数组里面的元素都是0,现在有三个操作: 操作1:给第k个数字加上d. 操作2 ...

  4. 靶形数独 (codevs 1174)题解

    [问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士拿出了他最近发明的“ ...

  5. “玲珑杯”ACM比赛 Round #12题解&源码

    我能说我比较傻么!就只能做一道签到题,没办法,我就先写下A题的题解&源码吧,日后补上剩余题的题解&源码吧!                                     A ...

  6. usaco training 4.2.4 Cowcycles 题解

    Cowcycles题解 Originally by Don Gillies [International readers should note that some words are puns on ...

  7. NOIP 2014 提高组 题解

    NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...

  8. bzoj usaco 金组水题题解(2.5)

    bzoj 2197: [Usaco2011 Mar]Tree Decoration 树形dp..f[i]表示处理完以i为根的子树的最小时间. 因为一个点上可以挂无数个,所以在点i上挂东西的单位花费就是 ...

  9. P1962 斐波那契数列-题解(矩阵乘法扩展)

    https://www.luogu.org/problemnew/show/P1962(题目传送) n的范围很大,显然用普通O(N)的递推求F(n)铁定超时了.这里介绍一种用矩阵快速幂实现的解法: 首 ...

随机推荐

  1. JAVA后端方面,如何快速达到能实习的程度

        概要地讲,是先广度再深度,面试开发两手抓. 首先说学习方法,因为很多初学者没继续下去,不是能力不行,而是方法不当.对比下错误和正确的方法. 1 光看视频光看资料不动手连,这样转眼就忘.正确的做 ...

  2. 24:WEB漏洞-文件上传之WAF绕过及安全修复

    本课重点 案例1:上传数据包参数对应修改测试 案例2:safedog+云服务器+uploadlabs测试 案例3:safedog+云服务器+uploadlabs_fuzz测试 案例4:文件上传安全修复 ...

  3. CF1553 部分题解

    CF1553D Backspace 题目传送门. 题意简述:给定 \(s,t\),现在要依次输入 \(s\) 中的字符.对于每个字符 \(s_i\),你可以选择输入 \(s_i\) 或者使用退格键,判 ...

  4. miRNA预测工具miRDeep-P2

    之前讲过预测植物miRNA的一款软件miR-PREFER, 今天在介绍一款软件miRDeep-p2, 也叫miRDP2 安装 在此之前,应安装一下软件 Bowite, Bowtie2, Vienna ...

  5. R语言与医学统计图形-【30】流行病学数据可视化

    sjPlot包适用于社会科学.流行病学中调查数据可视化,且能和SPSS数据无缝对接(流行病学问卷调查录入Epidata软件后,都会转成SPSS格式或EXCEL格式保存). 辅助包sjmisc进行数据转 ...

  6. Oracle-oracle中union和union all的区别

    union和union all的区别Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序:Union All:对两个结果集进行并集操作,包括重复行,不进行排序: union和un ...

  7. vector初始化的几种方式-STL

     vector<int>::iterator int_ite;  vector<string>::iterator string_ite;  //vector<T> ...

  8. 设置administrator账号密码

    设置administrator账号密码: 打开:附件->运行 输入:lusrmgr.msc 在里面的用户里修改administrator密码

  9. 字符串String的trim()方法

    用来删除字符串两端的空白字符并返回,trim方法并不影响原来的字符串本身,它返回的是一个新的字符串 String a = "  Hello World  "; String b = ...

  10. Demo03找素数

    package Deom1;import java.awt.*;import java.util.Scanner;public class lx {//输入任意两个正整数,求出这两个正整数之间素数的个 ...