A1006 SignIn and SignOut

//scanf("%s",temp.idnumber);//一开始这里写的是&temp.idnumber
//#define LOCAL
//后来一直是只有两个测试点可过,到底是为什么呢?
//原来是第一个时间是到的时间,是小的,第二个时间是走的时间,是大的,我输入存放的反了
#include<stdio.h>
//(后发现不需要)貌似要写两个结构体,一个是日期结构体,一个是签到记录结构体
//恩,想了一下,确实要两个结构体因为涉及到两个日期,也就是两个时,两个分,两个秒
//我去发现根本不要两个结构体,只要一个结构体,同一个记录的到的时间和走的时间,分两次输入就好,边输入边比较,边赋值给某个结果
//只要设置一个结构体,包括一个号码和一个时刻,
//因为本题可以完全看成是时刻表的最大最小值
struct Record{
    char idnumber[20];
    int hh,mm,ss;
}temp,ans1,ans2;

//如果结果为true ,则表示前一个比后一个大。如果是false,表示后一个大
bool great(Record r1,Record r2){
    if(r1.hh!=r2.hh) return r1.hh>r2.hh;
    if(r1.mm!=r2.mm) return r1.mm>r2.mm;
     return r1.ss>r2.ss;
}
int main(){
    //结构体变量学会全局地设置
    #ifdef LOCAL
    freopen("A1006data.in","r",stdin);
    freopen("A1006data.out","w",stdout);
    #endif
    int n;
    scanf("%d",&n);
    //ans1是大的,ans2是小的
    ans1.hh=24;
    ans1.mm=60;
    ans1.ss=60;
    ans2.hh=0;//一开始这里居然设置成了13!,没认真看题目啊! 改了之后正确测试点从1个变成了3个
    ans2.mm=0;
    ans2.ss=0;
    while(n--){
        getchar();//本来打算把这个删掉的,结果删了之后正确的从3个测试点减为2个测试点
        //scanf("%s",temp.idnumber);//一开始这里写的是&temp.idnumber
        scanf("%s %d:%d:%d",temp.idnumber,&temp.hh,&temp.mm,&temp.ss);
        if(great(temp,ans1)==false){
            //第一次的,错!:如果temp比最大值大的话,那么把temp的内容作为最大值
            //如果temp不比最小值大,那么最小值就是temop
            ans1=temp;
        }
        scanf("%d:%d:%d",&temp.hh,&temp.mm,&temp.ss);
        if(great(temp,ans2)){
            //如果最大值比temp大,也就是temp比最小值还要小,那么就把temp的内容作为最小值
            ans2=temp;
        }
        //最后要不要吸收空格
        //getchar();
    }
    //所有的输入之后应该可以了
    printf("%s %s\n",ans1.idnumber,ans2.idnumber);//这里后来前面的改掉了这里没有改,清晰的逻辑很重要吧
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值