2093 考试排名

http://acm.hdu.edu.cn/showproblem.php?pid=2093

思路:没涉及到很高深的算法,主要是细节方面要特别注意,题目的要求很细,题目其实不难!

用结构体来存储最后要输出的3个参数 name accepted punish;

用字符数组来存储以下数据:

每输入一个数据 就用函数(to_int)转换成对应的  accepted punish;

用 while(scanf("%s",name)!=EOF)来结束人的输入,键盘同时按住ctrl+z,输入文件结束符,再回车,计算排名。

#pragma warning(disable:4996)

//#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;

struct person {
    char name[11];
    int accepted;
    int punish;
}acmer[10000];

int n, m;//n题目数,m惩罚分 

int cmp(const void *q, const void *w)
{
    person *a = (person*)q, *b = (person*)w;

    if (a->accepted != b->accepted)
        return b->accepted - a->accepted;
    if (a->punish != b->punish)
        return a->punish - b->punish;
    return strcmp(a->name, b->name);
}

int to_int(char *p)//此函数将字符串中的数字转化为int型数据
{
    if (*p == ‘-‘ || *p == ‘0‘)
        return 0;//题目没做对,不做统计,直接0
    int punish = 0, temp = 0;
    while (*p)
    {
        if (*p == ‘(‘)
        {
            while (*(++p) != ‘)‘)
            {
                temp = temp * 10 + *p - ‘0‘;
            }
            break;
        }
        punish = punish * 10 + *p - ‘0‘;
        p++;
    }
    return punish + temp * m;
}
int main()
{
    char a[12];
    int score, i = 0;
    scanf("%d%d", &n, &m);
    while (scanf("%s", acmer[i].name) != EOF)
    {
        acmer[i].accepted = 0;
        acmer[i].punish = 0;
        for (int j = 0; j < n; j++)
        {
            scanf("%s", a);
            score = to_int(a);
            if (score > 0)
            {
                acmer[i].accepted++;
                acmer[i].punish += score;
            }
        }
        i++;
    }

    qsort(acmer, i, sizeof(acmer[0]), cmp);
    for (int j = 0; j < i; j++)
    {
        printf("%-10s %2d %4d\n", acmer[j].name, acmer[j].accepted, acmer[j].punish);
    }
    //system("pause");
    return 0;
}

扩展:

如何在vc中控制台输入EOF?先按ctrl+z然后回车即可。

关于scanf 这里整理了一下:

scanf 函数是有返回值的,它的返回值可以分成三种情况

正整数,表示正确输入参数的个数。例如执行 scanf("%d %d", &a, &b); 如果用户输入"3 4",可以正确输入,返回2(正确输入了两个变量);如果用户输入"3,4",可以正确输入a,无法输入b,返回1(正确输入了一个变量)。

0,表示用户的输入不匹配,无法正确输入任何值。如上例,用户如果输入",3 4",返回0。

EOF,这是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车(可能需要重复2次),就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。

所以可以使用下面的代码来处理输入:

while (scanf("%s %c %c", str, &oldchar, &newchar) == 3) /* 或!= EOF , 但前者更好 */
{
    ; //处理
}

cin,cout,以及其返回值

cin是个对象,没有所谓返回值之说,一般来说其他对象重载了>>操作符,才有了所谓的返回值,很多时候>>输入操作符返回流对象的引用,cin >> x 返回istream&,cout << x返回oostream&,暂且不说对象,就说c++的内嵌类型,如int,char之类的。

我们可以看到的现象是这样的:

1.if可直接判断流,如if (cin),while可以间接判断,如while (cin >> x)

2.若流被标记错误(读取失败)就返回false,也就是0。

3.键入EOF时,while(cin>>str){}会退出,其中str为string。

4.当在缓冲区读取到的数据与>>后面的变量类型不匹配的时候,就会结束。比如说a,b是int的,你如果在下面的cin>>里面输入的是非int的(比如说是‘a‘或其它)就会结束。

1.cin和cout是iostream类的2个对象,而对象是无所谓返回值的.有返回值的是<<还有>>这2个操作符.由于我们知道,操作符其实也就是函数(在操作符重载的时候可以清晰的认识到).而>>操作符返回的是它的左操作数(left-operand).对于cin>>value;返回左操作数就是操作的流的引用,也就是istream&.

2.但是好像还是不对,因为while里面判断的是bool值,难道还能判断istream&吗?

打开<ISTREAM>头文件,找到类模板basic_istream的定义,摘出:

 typedef basic_istream<_E, _Tr> _Myt;

           _Myt& operator>>(......) ......

这说明cin >>的返回值类型就是basic_istream&,可是放到while()中情况又该是怎样的。while()中要求是布尔表达式,难不成basic_istream&类型可以转换成bool类型?继续查看头文件,发现所有的operator重载函数都是<<和>>,没有找到用于类型转换的操作那就只好追溯到父类basic_ios了。

打开头文件<IOS.H>,找到ios的定义,其中有这么一条语句,类型转换函数的定义:

operator void *() const { if(state&(badbit|failbit) ) return 0; return (void this; }

有这个函数的定义之后,编译器会在需要的情况下将ios类型自动转换为void*类型。因此,在表达式while (cin >> m >> n)中,括号中的表达式为了匹配bool类型将自动转换为void*类型。如果读入时发生错误返回0,否则返回cin的地址。
///
  文件   bits/basic_ios.h
  ....
          public:
              operator   void*()   const
              {   return   this->fail()   ?   0   :   const_cast<basic_ios*>(this);   }   

              bool
              operator!()   const
              {   return   this->fail();   }
  ....  

总结;

When we use an istream as a condition, the effect is to test the state of the stream. If the stream is valid,if it is still possible to read another input then the test succeeds. An istream becomes invalid when we hit end-of-file or encounter an invalid input, such as reading a value that is not an integer. An istream that is in an invalid state will cause the condition to fail.

其对应代码是:while (std::cin >> value)

原文地址:https://www.cnblogs.com/CheeseIce/p/10801824.html

时间: 2024-10-10 02:33:14

2093 考试排名的相关文章

HDU 2093 考试排名

HDU 2093 考试排名 /* HDU 2093 考试排名 */ #include <cstdio> #include <string> #include <queue> #include <iostream> using namespace std; struct Node{ string name; int n; int useTime; bool operator<(const Node& rhs) const { //先按从n的值从大

HDU 2093考试排名

考试排名 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9543    Accepted Submission(s): 3327 Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么"AC",要么错误,不管怎样错法

题解报告:hdu 2093 考试排名

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2093 Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么"AC",要么错误,不管怎样错法,总是给你记上一笔,表明你曾经有过一次错误提交,因而当你一旦提交该题"AC"后,就要与你算一算帐了,总共该题错误提交了几回.虽然你在题数上,大步地跃上了一个台阶,但是在耗

hdu 2093 考试排名(结构体排序)

对"到文件结束"理解 代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct node { char name[20]; int num; int t; void init() { t=0; num=0; } }; int cmp(const node a,const node b) { if(a.num==b.num&&am

HPUOJ1293 考试排名

考试排名 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9744    Accepted Submission(s): 3398 Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么"AC",要么错误,不管怎样错法

考试排名

考试排名 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10089    Accepted Submission(s): 3540 Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么"AC",要么错误,不管怎样错

HDU2093 考试排名【水题】

考试排名 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9760    Accepted Submission(s): 3401 Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么"AC",要么错误,不管怎样错法

hdu2093(考试排名)

点击打开hdu2093 Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么"AC",要么错误,不管怎样错法,总是给你记上一笔,表明你曾经有过一次错误提交,因而当你一旦提交该题"AC"后,就要与你算一算帐了,总共该题错误提交了几回.虽然你在题数上,大步地跃上了一个台阶,但是在耗时上要摊上你共花去的时间.特别是,曾经有过的错误提交,每次都要摊上一定的单位时间

HD-ACM算法专攻系列(17)——考试排名

问题描述: 源码: 主要要注意输出格式. #include"iostream" #include"iomanip" #include"algorithm" #include"string" using namespace std; struct Person { string name; int count; int score; }; bool cmp(Person a, Person b) { if(a.count >