UVALive Problem 7073 Song Jiang's rank list(排序)——2014ACM/ICPC亚洲区广州站

本文主要是介绍UVALive Problem 7073 Song Jiang's rank list(排序)——2014ACM/ICPC亚洲区广州站,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

此文章可以使用目录功能哟↑(点击上方[+])

 UVALive Problem 7073 Song Jiang's rank list

Accept: 0    Submit: 0
Time Limit: 3.000 seconds

 Problem Description

≪ ShuiHuZhuan! ≫, also ≪ W aterM argin ≫ was written by Shi Nai’an — an writer of Yuan and Ming dynasty. ≪ ShuiHuZhuan! ≫ is one of the Four Great Classical Novels of Chinese literature. It tells a story about 108 outlaws. They came from different backgrounds (including scholars, fishermen, imperial drill instructors etc.), and all of them eventually came to occupy Mout Liang (or Liangshan Marsh) and elected Song Jiang as their leader.

In order to encourage his military officers, Song Jiang always made a rank list after every battle. In the rank list, all 108 outlaws were ranked by the number of enemies he/she killed in the battle. The more enemies one killed, one’s rank is higher. If two outlaws killed the same number of enemies, the one whose name is smaller in alphabet order had higher rank. Now please help Song Jiang to make the rank list and answer some queries based on the rank list.

 Input

There are no more than 20 test cases.

For each test case:

The first line is an integer N (0 < N < 200), indicating that there are N outlaws.

Then N lines follow. Each line contains a string S and an integer K (0 < K < 300), meaning an outlaw’s name and the number of enemies he/she had killed. A name consists only letters, and its length is between 1 and 50(inclusive). Every name is unique.

The next line is an integer M (0 < M < 200), indicating that there are M queries.

Then M queries follow. Each query is a line containing an outlaw’s name.

The input ends with n = 0.

 Output

For each test case, print the rank list first. For this part in the output, each line contains an outlaw’s name and the number of enemies he killed.

Then, for each name in the query of the input, print the outlaw’s rank. Each outlaw had a major rank and a minor rank. One’s major rank is one plus the number of outlaws who killed more enemies than him/her did.One’s minor rank is one plus the number of outlaws who killed the same number of enemies as he/she did but whose name is smaller in alphabet order than his/hers. For each query, if the minor rank is 1, then print the major rank only. Or else print the major rank, blank, and then the minor rank. It’s guaranteed that each query has an answer for it.

 Sample Input

5
WuSong 12
LuZhishen 12
SongJiang 13
LuJunyi 1
HuaRong 15
5
WuSong
LuJunyi
LuZhishen
HuaRong
SongJiang
0

 Sample Output

HuaRong 15
SongJiang 13
LuZhishen 12
WuSong 12
LuJunyi 1
3 2
5
3
1
2

 Problem Idea

解题思路:

【题意】
每次战斗之后,宋江都要给n个好汉排位

排位规则如下:

①战斗中杀人数越多的名次越靠前

②杀人数相同的,名字字典序小的人名次靠前

要求输出排好名次之后每个好汉的名字及杀人数

接着,m次询问,问某某好汉排位之后是第几名

该名次分为major名次和minor名次

major为杀人数排名,杀人数一样的并列,如样例中,WuSong和LuZhishen杀人数均为12,并列第3,而第4因此空出

minor为杀人数相同的几个人的排名


【类型】
sort排序

【分析】
显然,此题的排序可以直接用algorithm里封装好的sort函数来进行排序

只需要写一下cmp,定一下排序的优先级就可以了

而后面的m次询问,只需要将排好序的名次表遍历一遍,就可以找到对应好汉的排名

【时间复杂度&&优化】
O(m×n)

题目链接→UVALive Problem 7073 Song Jiang's rank list

 Source Code

/*Sherlock and Watson and Adler*/
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#include<cmath>
#include<complex>
#include<string>
#include<algorithm>
#include<iostream>
#define eps 1e-9
#define LL long long
#define PI acos(-1.0)
#define bitnum(a) __builtin_popcount(a)
using namespace std;
const int N = 205;
const int M = 55;
const int inf = 1000000007;
const int mod = 1000003;
struct outlaws
{char name[M];int k;
}s[N];
bool cmp(outlaws x,outlaws y)
{if(x.k!=y.k)return x.k>y.k;return strcmp(x.name,y.name)<0;
}
char ch[M];
int main()
{int n,i,j,m,major,minor;while(scanf("%d",&n)&&n){for(i=0;i<n;i++)scanf("%s%d",s[i].name,&s[i].k);sort(s,s+n,cmp);for(i=0;i<n;i++)printf("%s %d\n",s[i].name,s[i].k);scanf("%d",&m);for(i=0;i<m;i++){scanf("%s",ch);for(major=1,minor=j=0;j<n;j++){if(!j||s[j].k!=s[j-1].k)major+=minor,minor=1;elseminor++;if(!strcmp(s[j].name,ch)){printf("%d",major);if(minor!=1)printf(" %d",minor);puts("");break;}}}}return 0;
}
菜鸟成长记

这篇关于UVALive Problem 7073 Song Jiang's rank list(排序)——2014ACM/ICPC亚洲区广州站的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/226422

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

【软考】希尔排序算法分析

目录 1. c代码2. 运行截图3. 运行解析 1. c代码 #include <stdio.h>#include <stdlib.h> void shellSort(int data[], int n){// 划分的数组,例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量,换值int temp;in

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图