首页 > 其他分享 >F1 Champions 题解

F1 Champions 题解

时间:2023-02-14 17:34:34浏览次数:45  
标签:分数 F1 int 题解 次数 score 排序 Champions rk

题意

已知 \(n\) 场比赛前 \(m\) 名的名字,每场比赛前 \(10\) 名各有不同的分数,求以下两种排名方法排名第一的人的名字。

  1. 按照分数排序,若分数相同,第 \(1\) 次数多的优先,若第 \(1\) 次数相同,第 \(2\) 次数多的优先,直至比出为止。
  2. 先按排在第 \(1\) 的次数多的优先,次数相同则按照分数排序,分数相同的按照第 \(2\) 的次数排序,直至比出为止。

解题方法

数据范围很小,我们模拟即可。

首先,存储的问题我们用结构体解决。

struct node
{
	string name; //名字 
	int score, rk[51]; //得分以及各个排名的次数 
} a[1005];

第一种比较函数(按照分数排序,若分数相同,第 \(1\) 次数多的优先,若第 \(1\) 次数相同,第 \(2\) 次数多的优先,直至比出为止)。

bool cmp(node a, node b)
{
	if (a.score != b.score) return a.score > b.score; //按分数排序 
	for (int j = 1; j <= 50; j ++) if (a.rk[j] != b.rk[j]) return a.rk[j] > b.rk[j]; //从大到小按照排名次数排序 
}

第二种比较函数(先按排在第 \(1\) 的次数排序,次数相同则按照分数排序,分数相同的按照第 \(2\)的次数排序,还相同的按排在第 \(3\) 的次数排序,直至比出为止)。

bool csp(node a, node b)
{
	if (a.rk[1] != b.rk[1]) return a.rk[1] > b.rk[1]; //按第1的次数排序 
	if (a.score != b.score) return a.score > b.score; //按分数排序 
	for (int j = 2; j <= 50; j ++) if (a.rk[j] != b.rk[j]) return a.rk[j] > b.rk[j]; //从大到小按照排名次数排序 
}

至于楼上楼下的几位大佬,为什么要用两次快排呢?这不是平白无故的给时间复杂的加上一个 \(log\) 吗?两次循环直接取最优的那个不香吗?

#include <bits/stdc++.h>
using namespace std;
struct node
{
	string name; //名字 
	int score, rk[51]; //得分以及各个排名的次数 
} a[1005];
int n, cnt, f[51] = {0, 25, 18, 15, 12, 10, 8, 6, 4, 2, 1}, i;
bool find(string s)
{
	for (int j = 1; j <= cnt; j ++)
		if (a[j].name == s)
		{
			a[j].score += f[i];
			a[j].rk[i] ++;
			return true;
		}
	return false;
}
bool cmp(node a, node b)
{
	if (a.score != b.score) return a.score > b.score; //按分数排序 
	for (int j = 1; j <= 50; j ++) if (a.rk[j] != b.rk[j]) return a.rk[j] > b.rk[j]; //从大到小按照排名次数排序 
}
bool csp(node a, node b)
{
	if (a.rk[1] != b.rk[1]) return a.rk[1] > b.rk[1]; //按第1的次数排序 
	if (a.score != b.score) return a.score > b.score; //按分数排序 
	for (int j = 2; j <= 50; j ++) if (a.rk[j] != b.rk[j]) return a.rk[j] > b.rk[j]; //从大到小按照排名次数排序 
}
int main()
{
	scanf("%d", &n);
	while (n --)  
	{
		int m;
		scanf("%d", &m);
		for (i = 1; i <= m; i ++)
		{
			string s;
			cin >> s;
			if (!find(s))
			{
				a[++ cnt].name = s;
				a[cnt].score = f[i];
				a[cnt].rk[i] = 1;
			}
		}
	}
	node ans = a[1];
	for (int j = 2; j <= cnt; j ++) if (cmp(a[j], ans)) ans = a[j]; //第一种方法比较 
	cout << ans.name << endl;
	ans = a[1];
	for (int j = 2; j <= cnt; j ++) if (csp(a[j], ans)) ans = a[j]; //第二种方法比较 
	cout << ans.name;
}

本小学蒟蒻的第一篇蓝题题解,请大家多多关照。
管理员同志过年审题解辛苦了!

标签:分数,F1,int,题解,次数,score,排序,Champions,rk
From: https://www.cnblogs.com/tongyuxin/p/17120312.html

相关文章

  • Social Network 题解
    题意:题目翻译是有问题的,题目的真正意思其实是\(∀i∈[1,d]\),求在满足\([1,i]\)的规定的前提下恰好连\(i\)条边的无向图中度数最大联通块的大小减\(1\)。思路考虑......
  • P8827 [传智杯 #3 初赛] 森林 题解
    题意有一颗树,每个点有一个点权\(v\)。现在要对这棵树进行\(m\)次以下三种操作之一:删除一条边。修改一个点的点权。查询一个点\(u\)所在的树的点权之和。......
  • lg8365题解
    容易发现我们一定会先加后乘,使用调整法可以证明这个结论。并且可以发现除了\(a_i\)值为\(1\)的数外(假设他们的\(a\)值和为\(s\)),其他的数最多只会选\(1\)个做加法操作(设如......
  • Vue项目在ie浏览器中显示空白的兼容性问题解决
    问题:在ie浏览器中页面报错:SCRIPT5022:SecurityError小编也不知道原因是什么,小编是尝试了以下几种方式才显示出来,这里建议大家试试看。1、下载软件包:@babel/polyfill执......
  • CF1735C_Codeforces Round #824 (Div. 2)C
    题意:现有一个26个小写字母形成的环,将一个字符串加密,加密规则为将字母变换为环中该字母顺时针的下一个字母现给出加密后的字符串,要求解密出字典序最小的字符串分析:对于......
  • stm32f103 sdio 移植st官方例程
    第一步:建立驱动文件建立sdio_sdcard.h和sdio_sdcard.c,并将这两个文件添加到MDK工程中,如下图   第二步:移植官方例程1.找到STM32F10x_StdPeriph_Lib_V3.5.0\Pr......
  • elementUI的table表格改变数据不更新问题解决
    问题原因:在Vue实例创建时,以及data赋值时editable并未声明,因此就没有被Vue转换为响应式的属性,自然就不会触发视图的更新。解决方案:1、给data赋值前把editable属......
  • C++奥赛一本通递推题解
    title:C++奥赛一本通刷题记录(递推)date:2017-11-08tags:一本通openjudegecategories:OIC++奥赛一本通刷题记录(递推)2017.11.8Bygwj1139177410斐波那契数列​​op......
  • C++奥赛一本通排序题解
    title:C++奥赛一本通刷题记录(排序)date:2017-11-16tags:一本通openjudegecategories:OIC++奥赛一本通刷题记录(排序)2017.11.16Bygwj1139177410都是拿STL水的…别......
  • C++奥赛一本通刷题高精度题解
    title:C++奥赛一本通刷题记录(高精度)date:2017-11-15tags:一本通openjudegecategories:OIC++奥赛一本通刷题记录(高精度)2017.11.15Bygwj1139177410大整数加法​......