题意是说有一些人参加了不同级别的班,级别有 lower,middle,upper 三种,级别可以组合,出现比如 lower upper,middle upper 这种级别,级别的比较是从右往左,如果在一组比较中有的人的组合级别多,就以本组中级别最多的作为参照,其他人的级别要在左边添加 middle 来补到一样多。如果有人的级别是相等的,这些级别相等的人就按照名字的字典序排序。最后将排好序的名字依次输出。

开始本人的做法是将 lower,middle,upper 分别变成 1,2,3,然后从右向左将每个人的级别写成一个十进制的数,用 sort() 排序即可。

但是题中说每行不超过 256 个字符,也就是说级别数量会达到 50 个左右,写成一个数字很明显是存不下的,然后就糊涂了,竟然开始考虑用 4 进制来存,其实这里没有进位,和十进制是一样的长度,而且继续降低进制会反而将数字变长......

经高人指点,恍然大悟,原来可以直接开数组去存每一个数......

此外,在进行字典序排序的时候竟然不知道怎么写,其实可以直接比较 string 的,竟然还手写去连续比较了几位.......

题目代码如下:

 //#include <cstdio>
//#include <iostream>
//#include <algorithm>
//using namespace std;
//struct mem
//{
// string name,al;
// int cnt,sco,w[1050];
//}stu[1052];
//int n;
//bool cmp(mem a,mem b)
//{
// if(a.sco != b.sco)
// return a.sco < b.sco;
// else if(a.name[0] != b.name[0])
// return a.name[0] > b.name[0];
// else if(a.name[1] != b.name[1])
// return a.name[1] > b.name[1];
// else if(a.name[2] != b.name[2])
// return a.name[2] > b.name[2];
// else if(a.name[3] != b.name[3])
// return a.name[3] > b.name[3];
// return a.name[4] > b.name[4];
//}
//int main()
//{
// int len,big;
// bool f;
// scanf("%d",&n);
// getchar();
// big = -1000;
// for(int i = 0;i <n; i++)
// {
// getline(cin,stu[i].al);
// len = (stu[i].al).length();
// f = true;
// stu[i].cnt = 0;
// stu[i].sco = 0;
// for(int j = 0 ;j < len; j++)
// {
// if(stu[i].al[j] == ':') f = false;
//
// if(f) stu[i].name += stu[i].al[j];
// else{
// if(stu[i].al[j] == 'c') break;
// else if(stu[i].al[j] == 'u')
// {
// stu[i].w[stu[i].cnt++] = 3;
// j += 5;
// }
// else if(stu[i].al[j] == 'm')
// {
// stu[i].w[stu[i].cnt++] = 2;
// j += 6;
// }
// else if(stu[i].al[j] == 'o')
// {
// stu[i].w[stu[i].cnt++] = 1;
// j += 4;
// }
// }
// }
// if(stu[i].cnt > big) big = stu[i].cnt;
// }
// for(int i = 0 ; i < n;i++)
// {
// for(int j = stu[i].cnt-1; j >=0 ; j--)
// stu[i].sco = stu[i].w[j] + stu[i].sco *4;
// while(stu[i].cnt < big)
// {
// stu[i].sco = 2 + stu[i].sco*4;
// stu[i].cnt++;
// }
// }
// sort(stu,stu+n,cmp);
// for(int i = n-1 ; i >= 0; i--)
// cout << stu[i].name << endl;
// return 0;
//}
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
char name[];
char lever[];
char sco[];
} stu[];
bool cmp(struct node a,struct node b)
{
if(strcmp(a.sco,b.sco) != ) return (strcmp(a.sco,b.sco) > );
return strcmp(a.name,b.name) < ;
}
void rev(char *s,int n)
{
for(int i = , j = n - ; i < j; i++, j--)
{
char c = s[i];
s[i] = s[j];
s[j] = c;
}
}
int main()
{
int cnt,n;
scanf("%d",&n);
for(int i = ; i < n; i++)
{
cnt = ;
scanf("%s",stu[i].name);
int str = strlen(stu[i].name);
stu[i].name[str-] = ;
for(int j = ; j < ; j++)
{
if(j == ) stu[i].sco[j] = ;
else stu[i].sco[j] = '';
}
while()
{
scanf("%s",stu[i].lever);
if(strcmp("upper",stu[i].lever)==) stu[i].sco[cnt++]='';
if(strcmp("middle",stu[i].lever)==) stu[i].sco[cnt++]='';
if(strcmp("lower",stu[i].lever)==) stu[i].sco[cnt++]='';
if(strcmp("class",stu[i].lever)==) break;
}
rev(stu[i].sco,cnt);
}
sort(stu,stu+n,cmp);
for(int i=; i<n; i++) printf("%s\n",stu[i].name);
return ;
}

Gym 100820C(级别排序 **)的更多相关文章

  1. 2016"百度之星" - 初赛(Astar Round2A)Gym Class(拓扑排序)

    Gym Class  Accepts: 849  Submissions: 4247  Time Limit: 6000/1000 MS (Java/Others)  Memory Limit: 65 ...

  2. 2016"百度之星" - 初赛(Astar Round2A) 1006 Gym Class 拓扑排序

    Gym Class  Time Limit: 6000/1000 MS (Java/Others)  Memory Limit: 65536/65536 K (Java/Others) Problem ...

  3. HDU 5695 Gym Class 拓扑排序

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5695 题解: 求出字典序最大的拓扑序.然后把求好的数列翻转过来就是满足条件的数列,然后模拟求一下va ...

  4. spark高级排序彻底解秘

    排序,真的非常重要! RDD.scala(源码) 在其,没有罗列排序,不是说它不重要! 1.基础排序算法实战 2.二次排序算法实战 3.更高级别排序算法 4.排序算法内幕解密 1.基础排序算法实战 启 ...

  5. Java:集合,对列表(List)中的自定义对象按属性(字段)排序(正序、倒序)的方法

    1. 要求 对列表(List)中的自定义对象,要求能够按照对象的属性(字段)进行排序(正序.倒序). 如:用户对象(Member)有用户名(username).级别(level).出生日期(birth ...

  6. 我的Java开发学习之旅------>Java利用Comparator接口对多个排序条件进行处理

    一需求 二实现Comparator接口 三验证排序结果 验证第一条件首先按级别排序级别最高的排在前面 验证第二条如果级别相等那么按工资排序工资高的排在前面 验证第三条如果工资相当则按入职年数排序入职时 ...

  7. 扩增子图表解读4曼哈顿图:差异分类级别Taxonomy

    曼哈顿图 Manhattan Plot 曼哈顿图本质上是一个散点图,用于显示大量非零大范围波动数值,最早应用于全基因组关联分析(GWAS)研究展示高度相关位点.它得名源于样式与曼哈顿天际线相似(如下图 ...

  8. 关于logback日志级别的配置

    logback如果需要灵活的配置日志级别,需要结合过滤器,<filter></fiter>这个标签.需要注意的是,过滤器过滤的基础是在root标签的配置基础上进行的. 过滤器可 ...

  9. Python数据类型之“序列概述与基本序列类型(Basic Sequences)”

    序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主要以下几种类型: 3种基本序列类型(Basic Sequence Types):list. ...

随机推荐

  1. 【UOJ#236】[IOI2016]railroad(欧拉回路,最小生成树)

    [UOJ#236][IOI2016]railroad(欧拉回路,最小生成树) 题面 UOJ 题解 把速度看成点,给定的路段看成边,那么现在就有了若干边,然后现在要补上若干边,以及一条\([inf,\) ...

  2. [luogu2571][bzoj1857][SCOI2010]传送门【三分套三分】

    题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxh ...

  3. 每天一个Linux命令(03):du命令

    du命令 今天找开发定位问题,看到他使用了这个命令,查看文件,之前知道df,所以今天的每天系列把这命令 du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空 ...

  4. 「SHOI2014」三叉神经树 解题报告

    「SHOI2014」三叉神经树 膜拜神仙思路 我们想做一个类似于动态dp的东西,首先得确保我们的运算有一个交换律,这样我们可以把一长串的运算转换成一块一块的放到矩阵上之类的东西,然后拿数据结构维护. ...

  5. [SCOI2016]萌萌哒(倍增+并查集)

    一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四个数,l1,r1,l2,r2,即两个长度相同的区间,表示子串Sl1Sl1 ...

  6. CentOS下Denyhosts的安装和使用

    安装 默认yum就可以进行安装 yum install denyhosts* -y 配置 配置文件路径: /etc/denyhosts.conf ; YUM安装时其实已经配置好了大部分,我们自己稍作改 ...

  7. 2019西北工业大学程序设计创新实践基地春季选拔赛(重现赛) Chino with Equation(组合公式)

    链接:https://ac.nowcoder.com/acm/contest/553/D来源:牛客网 题目描述 Chino的数学很差,因此Cocoa非常担心.今天,Cocoa要教Chino解不定方程. ...

  8. mysql慢查询,死锁解决方案

    1. 先使用root用户登录到MySQL中 2. 使用show processlist查看其查询速率 +----+------+-----------------+------+---------+- ...

  9. 牛客寒假算法基础集训营3B 处女座的比赛资格(用拓扑排序解决DAG中的最短路)

    链接:https://ac.nowcoder.com/acm/contest/329/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  10. 【洛谷P4145】花神游历各国

    题目大意:给定一个长度为 N 的序列,支持区间开根,区间求和. 题解:对于区间开根操作,可以发现任何一个位置的值开根至多 6 次就会变成 1.因此即使是整个区间开根,暴力修改6次后,所有的点的权值均小 ...