HDU2093,康复之旅第一篇

2017-09-19  本文已影响0人  Amosasas

题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=2093
大意就是让我们对一场考试进行名次排序,怎么排呢?AC多的人在前,AC数目相同的情况下呢,我们看花费的时间,时间少的在前,若题目做对的数目和花费的时间都相同,那么就用字典序,小的在前。表示方法就是一下几种

0 表示未开始做此题
-2 表示做了题目但没有做对,还做错了2次,但是不罚时
2(2) 也就是花了2个单位的时间,但是错了2次,这个要罚时
2 就是花了2个单位的时间做对了

大体思路:处理结构体排序,以及输入(各种EOF scanf)输出处理(左右对齐)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct STUDENT{
  char name[200];
  int correct;
  int cost;
};
bool cmp(STUDENT x,STUDENT y)
{
    if(x.correct!=y.correct) return x.correct>y.correct;
    else if(x.cost!=y.cost) return x.cost<y.cost;
    else return strcmp(x.name,y.name)<0;
}
int main()
{
 //   freopen("sample.txt","r",stdin);
    STUDENT student[200];
    char s[200],wrongAns[200],costTime[200];
    char *ptrBegin;
    int n,m;
        
        scanf("%d %d",&n,&m);   
        int i=0;                                     //i 学生人数
        while(scanf("%s",&student[i].name)!=EOF)     //处理第i个学生
        {
            student[i].correct=0;
            student[i].cost=0;
            for(int j=0;j<n;j++)                    //j个题 
            {
                scanf("%s",&s);
                if(s[0]=='0') continue;                                //0
                else if(s[0]=='-') continue;                           //-
                else                                                   //m(n)
                {
                    ptrBegin=strchr(s,'(');
                    if(ptrBegin)                                       //有n
                    {
                        memset(wrongAns,0,sizeof(char));
                        memset(costTime,0,sizeof(char));
                        int t=0;
                        for(int k=0;k<strlen(s)-strlen(ptrBegin);k++)
                        {
                            costTime[t]=s[k];
                            t++;
                        }
                        costTime[t]='\0';
                        t=0; 
                        for(int k=strlen(s)-strlen(ptrBegin)+1;k<strlen(s)-1;k++)
                        {
                            wrongAns[t]=s[k];
                            t++;
                        }
                        wrongAns[t]='\0';
                        student[i].cost+=atoi(costTime);
                        student[i].cost+=m*atoi(wrongAns);
                    }
                    else                                                //无n
                    {
                        student[i].cost+=atoi(s);  
                    }
                    student[i].correct++;
                }
            }
            i++;
        }
        sort(student,student+i,cmp);
        for(int k=0;k<i;k++){
            printf("%-10s%3d%5d\n",student[k].name,student[k].correct,student[k].cost);
        }
             
//  fclose(stdin);
    return 0;
}

由于实在是太久没有接触这个语言了,对语法和细节基本都是边百度边做的,很痛苦,我在进行杭电的100题训练提升自己。

上一篇 下一篇

猜你喜欢

热点阅读