2093 考试排名

Posted cheeseice

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
 

以上是关于2093 考试排名的主要内容,如果未能解决你的问题,请参考以下文章

ACM比赛得分排名,HDU 2093

B - 考试排名

PHP 搜索引擎排名跟踪器 - RankTrackr访问片段

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

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

ZJNU 1164 - 考试排名——中级