杭电 ACM Step(3)

原创 2018年04月15日 17:26:30

What Is Your Grade?

这里写图片描述
这里写图片描述

  • 难点
    在这道题中,先按照解题数目和解题时间综合排序后,还需要计算在同等解题数目的情况下,这个人的解题时间是否在他解题数目相同的人群中的前一半。
#include <stdio.h>
#include <stdlib.h>
typedef struct{
    int P;/*解题数目*/
    int hour;
    int minute;
    int seconds;
    int num;/*原始编号*/
    int score;/*成绩*/
}StuInfo;
int cmp(const StuInfo *p,const StuInfo *q)
{
    if(p->P != q->P)
        return q->P - p->P;
    if(p->hour != q->hour)
        return p->hour - q->hour;
    if(p->minute != q->minute)
        return p->minute - q->minute;
    return p->seconds-q->seconds;
}
int cmpn(const StuInfo *p,const StuInfo *q)
{
    return p->num - q->num;
}
int main()
{
    int num;//学生人数
    StuInfo S[105];
    int problem[6];
    int rank[6];
    while(scanf("%d",&num)!= EOF && num !=-1)
    {
        for(int i=0;i<6;i++)
            problem[i]=rank[i]=0;
        for(int i=0;i<num;i++)
        {
            scanf("%d%d:%d:%d",&S[i].P,&S[i].hour,&S[i].minute,&S[i].seconds);
            problem[S[i].P]++;/*做对n道题的有多少人*/
            S[i].num=i;
        }
        for(int i=4;i>0;i--)
            rank[i]=rank[i+1]+problem[i+1];
        qsort(S,num,sizeof(S[0]),cmp);
        for(int i=0;i<num;i++)
        {
            S[i].score=S[i].P*10+50;
            if(S[i].P==0 || S[i].P==5) continue;
            /*如果解题数和耗时综合排序在做对n道题目的前一半,成绩加5*/
            if(i-rank[S[i].P] < (problem[S[i].P]/2)) S[i].score+=5;
        }
        qsort(S,num,sizeof(S[0]),cmpn);
        for(int i=0;i<num;i++)
            printf("%d\n",S[i].score);
        printf("\n");
    }
    return 0;
}

排序

这里写图片描述

#include <stdio.h>
#include <stdlib.h>
/*
1.开始的若干个5需要跳过去;
2.最后的若干个5需要跳过去;
3.中间的若干个5需要正确跳过去。
程序中使用了标志flag,来处理若干个5
*/
int cmp(const void *p,const void *q)
{
    return *(int*)p - *(int*)q;
}
int main()
{
    char figure;
    int val=0,flag=1;
    int values[2000];
    int count=0,i=0;
    while(scanf("%c", &figure)!=EOF)
    {
        if(figure == '\n')/*一次性输入字符串后*/
        {
            if(flag == 0)  values[count++] = val;/*最后一段字符是有效数据*/
            if(count > 0)
            {
                qsort(values, count, sizeof(int), cmp);/*对划分好的数据快速排序*/
                for(i=0; i<count-1; i++)
                    printf("%d ", values[i]);
                printf("%d\n", values[count-1]);
            }
            val = 0;
            count = 0;
            flag = 1;
        }
        else if(figure == '5')
        {
            if(flag == 0)  values[count++] = val;/*一个有效字符串后跟着5的情况*/
            /*这个5出现在有效字符串前面*/
            val = 0;
            flag = 1;
        }
        else
        {
            val = val * 10 + figure - '0';/*计算有效数据*/
            flag = 0;
        }
    }
    return 0;
}

考试排名

这里写图片描述
这里写图片描述

解题思路

在这道题目中遇到了一个比较难的地方,就是类似于51(2)这样的数据该怎么输入。看了一下别人的代码,发现都是先用字符串接收,然后再将其转为数字。
将所有数据成功传入后,在面临排序时,直接调用了

qsort()函数

  • 原型:qsort(void*, size_t, size_t,int ()(const void, const void*));
  • 参数:
    1. 待排序数组首地址
    2. 数组中待排序元素数量
    3. 数组中各元素的占用空间
    4. 指向函数的指针,用于确定排序的顺序

    代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h> 
typedef struct{
    char name[11];/*姓名*/
    int ac; /*解题数目*/
    int time;/*解题时间*/
}ACM;
int char_int(char *p,int mark)/* 将字符串中的数字转化为int型数据 */
{
    if(*p == '-' || *p=='0') /* 题目没做对,不做统计 */
        return 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*mark;
}
int cmp(const ACM *p,const ACM *q)
{
    if(p->ac != q->ac)
        return q->ac - p->ac;/*先按解题数目排序*/
    if(p->time != q->time)
        return p->time - q->time;/*在解题数目一样的情况下,再按解题时间排序*/
    return strcmp(p->name,q->name);/*在解题数目和时间一样的情况下,按名字排序*/
}
int main()
{
    ACM A[1000];
    int num,mark;/* num是考题数,mark是单位罚分数*/
    scanf("%d%d",&num,&mark);
    int i=0,score;
    char a[12];
    while(scanf("%s",A[i].name) != EOF)
    {
        A[i].ac=0;
        A[i].time=0;
        for(int j=0;j<num;j++)
        {
            scanf("%s",a);
            score=char_int(a,mark);
            if(score>0)
            {
                A[i].ac++;
                A[i].time+=score;
            }
        }
        i++;
    }
    qsort(A,i,sizeof(A[0]),cmp);/*引用<stdlib.h>中的快速排序*/
    for(int j=0;j<i;j++)
        printf("%-10s %2d %4d\n",A[j].name,A[j].ac,A[j].time);
    return 0;
}

Rank

这里写图片描述

#include <stdio.h>
typedef struct{
    int Sno;
    int Grade;
} Student;
int main()
{
    Student S[1005];
    Student T;
    int number;
    int a,b;
    int i,flag;
    int flag2=0;
    while(scanf("%d",&number) != EOF)
    {
        i=0;
        while(scanf("%d%d",&a,&b) != EOF && a !=0 && b != 0)
        {
            S[i].Sno=a;
            S[i].Grade=b;
            i++;
        }
        for(int j=0;j<i;j++)
        {   /*选择排序,但是只对成绩大于等于给定学号的进行排序*/
            flag=j;
            for(int k=j+1;k<i;k++)
                if(S[flag].Grade<S[k].Grade) flag=k;
            T=S[flag];
            S[flag]=S[j];
            S[j]=T;
            if(S[j].Sno == number)
            {
                flag2=j;
                break;
            }
        }
        int Rank=1;
        /*假如有和Jackson分数一样的同学,Jackson的排名和他们是并列排名*/
        for(int j=0;j<flag2;j++)
            if(S[j].Grade != S[flag2].Grade) Rank++;
        printf("%d\n",Rank);
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qinlingheshang/article/details/79949716
收藏助手
不良信息举报
您举报文章:杭电 ACM Step(3)
举报原因:
原因补充:

(最多只允许输入30个字)