xtuoj 模拟 1176 First Blood

xtuoj 模拟 1176  First Blood

是个菜鸡,写的不好。


算法:边输入边运算(?)

Description
题目描述

ICPC比赛中,某道题的第一次正确提交,被称为First Blood。现给你一个提交的日志文件,请计算出所有题目的First Blood情况。
输入

样例的第一行是一个整数N,表示比赛题目的总数(1≤N≤16)。 以后每行是一条日志信息,包含提交的时间,格式为小时:分钟:秒, 提交队伍号,题目的题号(从1001开始),判题结果。 判题结果为“Accepted”为正确提交,其他都为错误提交。如果有多个队伍同时刻正确提交同一道题,以出现在前的队伍为准。日志信息不是按时间顺序给出。
输出

按题目顺序,每行输出一个题的First Blood情况,包含题号, First Blood的时间,提交的队伍号。如果没人正确提交,则只需要输出题号。
样例输入

3
00:35:10 Team001 1001 Wrong Answer
00:55:20 Team002 1002 Runtime Error
00:56:21 Team003 1002 Time Limit Error
01:06:22 Team001 1001 Accepted
01:26:56 Team002 1001 Accepted
02:08:10 Team003 1001 Wrong Answer
02:10:33 Team003 1001 Accepted
02:20:10 Team001 1002 Time Limit Error
02:40:20 Team003 1003 Accepted
02:42:52 Team002 1002 Accepted
02:50:35 Team003 1002 Runtime Error
02:51:48 Team003 1002 Accepted

样例输出

1001 01:06:22 Team001
1002 02:42:52 Team002
1003 02:40:20 Team003

 

开始时并没有注意题目没有说一共会输入多少条信息,所以还想着用数组保存所有的数据,排序再比较一下就可以了,还是太天真!
因为没说信息的数量,而且发现这是一个比较的过程,所以经舍友聚聚提点,想到了边输入边比较的算法。

开始写的贼傻,所以看了一下大佬的代码,又简化(学习)了一下

#include<stdio.h>
#include<string.h>
int num1,x,n,i,a[16];
char time[16][10],time1[10],team[16][10],team1[10],sta[16][50],sta1[50];
int main()
{
    scanf("%d",&n);
    while(scanf("%s %s %d ",time1,team1,&num1)!=EOF)
    {
        gets(sta1);
        x=num1-1001;
        if('A'==sta1[0] && (a[x]==0 || strcmp(time1,time[x])<0))//是ac且时间小或者是第一次输入 ,用strcmp对ac进行判断也可以啦。
        {
            strcpy(time[x],time1);
            strcpy(team[x],team1);
            sta[x][0]='A';
            a[x]=1;
        }
    }
    for(i=0;i<n;i++)
    {
        if('A'!=sta[i][0])//也可改为if(a[i]==0),也是表达未ac的意思。
        {
            printf("%d\n",i+1001);
        }
        else
        {
            printf("%d ",i+1001);
            printf("%s ",time[i]);
            printf("%s\n",team[i]);
        }
    }
    return 0;
} 

总结一下优点:

1.利用strcmp()直接对时间进行比较,因为其对字符的比较和对时间的比较的思路是一样的!都是比较各个字符码的大小。

(而且直接整体对时间,队名等输入,避免了下面gets()会多输入空格的问题)

2.用一个数组a[]表示题目有没有ac,(1表示已ac,0表示未ac)如果未ac就直接赋值,不必比较大小(因为初值是0,是最小的)。而我之前的想法是对时间赋一个非常大的值,这样未ac的时候也可以进行赋值。

以下是贼傻的版本一:

#include<stdio.h>
#include<string.h>
int main()
{
    int h[16],h1,m[16]={0},m1,s[16]={0},s1,num1,x,n,i;
    char team[16][10],team1[10],sta[16][50],sta1[50];
    for(i=0;i<16;i++)
    {
        h[i]=24;
    }
    scanf("%d",&n);
    while(scanf("%d",&h1)!=EOF)
    {
        scanf(":%d",&m1);
        scanf(":%d",&s1);
        scanf("%s",team1);
        scanf("%d ",&num1);
        gets(sta1);/*注意此处不能用scanf,如输入wa,answer会被当成h1输入!
且gets会把字符串前面的空格也输入,所以要在num后加一个空格,保证输入的sta前不含空格,这样才可以比较!!!*/
        x=num1-1001;
        if('A'==sta1[0] && (3600*h1+60*m1+s1)<(3600*h[x]+60*m[x]+s[x]))//是ac且时间小
        {
            h[x]=h1;
            m[x]=m1;
            s[x]=s1;
            strcpy(team[x],team1);
            sta[x][0]='A';
        }
    }
    for(i=0;i<n;i++)
    {
        if('A'!=sta[i][0])
        {
            printf("%d\n",i+1001);
        }
        else
        {
            printf("%d ",i+1001);
            if(h[i]<10)
            {
                printf("0%d",h[i]);
            }
            else if(h[i]>=10)
            {
                printf("%d",h[i]);
            }
            if(m[i]<10)
            {
                printf(":0%d",m[i]);
            }
            else if(m[i]>=10)
            {
                printf(":%d",m[i]);
            }
            if(s[i]<10)
            {
                printf(":0%d",s[i]);
            }
            else if(s[i]>=10)
            {
                printf(":%d",s[i]);
            }
            printf(" %s\n",team[i]);
        }
    }
    return 0;
}

这是最初的代码,因为不知道如何对时间进行输入输出及计算,就想出的一个很麻烦的方法输出时间。

而且由于是分开输入的时间,导致最后gets(sta1)时第一个字符一直是空格!!!(这个傻子用了好长时间才发现)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值