HDOJ 2093 考试排名(表格,字符串)

来源:互联网 发布:阿里云api接口 编辑:程序博客网 时间:2024/05/20 16:11

HDOJ 2093
这是一道字符串处理的题目。题目本身没有太高深的算法,只是以表格的形式处理很麻烦。比如出现的116(5),括号的读入和处理。
看着解题报告完成的,收获了很多。
第一,STL中的sort排序,自己定义了排序规则cmp函数,可以按照题目的要求进行排序。
第二,这里用到了sscanf的读取的一个技巧。认真分析这里的sscanf的使用。
sscanf的用法:
a.本题:
sscanf(s,”%d(%d)”,&x,&y); //从字符串中读取出x,y.

b.将字符读入到字符串中
sscanf(“12345”,”%s”,str);
printf(“用法三\nstr = %s\n”,str);
则 str=12345
第三,用结构体解决类似问题,很明显的面向对象的思想。
第四,不要害怕一道题,这题目上次遇见时看都不想看,实际上静下心来看不是很困难。

对了还有一个地方要说明一下,就是解决带有括号的那个地方。下面有一行代码是:

    if(s[1]=='('||strlen(s)>=5)

刚开始没看懂原作者的意图,后来觉得大概是他假设如果此题在AC但是有错误提交的情况下,如果提交的时间在1-9之间,那么s[1]就存储的应该是‘(’,如果提交的时间10-1000的话,那么比如20(3),字符串的长度至少大于等于5.所以strlen(s)>=5.

sscanf的使用技巧:http://blog.csdn.net/sjf0115/article/details/8579935

#include <stdio.h>#include <math.h>#include <stdlib.h>#include <string.h>#include <string>#include <algorithm>#include <iostream>#include <ctype.h>#include <set>#include <map>#include <vector>using namespace std;struct Stu{    int acnum,time;     char name[10];};int n,m,i,num,wa,ac,x,y;Stu data[100000];char s[20];bool pd;bool cmp(Stu x,Stu y){    if(x.acnum >y.acnum) return true;    if(x.acnum ==y.acnum &&x.time <y.time ) return true;    if(x.acnum ==y.acnum &&x.time ==y.time &&strcmp(x.name ,y.name)<=0 ) return true;    return false;}int main(){    cin>>n>>m; //考试题目数和罚时分    num=1;    while(scanf("%s",data[num].name )!=EOF){        data[num].acnum=0;data[num].time=0;wa=0;ac=0; //初始化        for(i=1;i<=n;i++){            memset(s,'\0',sizeof(s));   pd=false;               scanf("%s",s);            if(s[0]=='-'||s[0]=='0'){ //没有AC                pd=true;        }            if(s[1]=='('||strlen(s)>=5){ //AC了,但是有错误提交                pd=true;                ++ac;            sscanf(s,"%d(%d)",&x,&y); //从字符串中读取出x,y.sscanf的一个重要用法            data[num].time+=x;            wa+=y;            }            if(pd==false){  //AC且没有错误提交                ++ac;                sscanf(s,"%d",&x); data[num].time +=x;            }        }            data[num].time +=wa*m;//加上罚时            if(data[num].time<0) {                data[num].time =0;            }            data[num].acnum =ac;            ++num; //记录下一个选手        }            sort(data+1,data+num,cmp); //自定义sort的排序规则            for(i=1;i<=num-1;i++){            printf("%-10s %2d %4d\n",data[i].name ,data[i].acnum ,data[i].time );//输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。名字、题数和时间分相互之间有一个空格。            }        return 0;}