學霸貓

題目:

在我認識它的時候,它就已經叫學霸貓了,雖然我不知道它名字的由來,但在石大這種地方被冠以學霸之名。它經常會光顧正在上課的教室,並跟同學們一起耐心聽講,學校的教學樓、機房裏到處都留下它的倩影,相信它將來會成爲一個Doctor Cat。有心的同學記錄下了它出現的課堂名稱和出現時間。聰明的學霸貓是非常擅長學習的,即使在打盹的時候,也是在學習。它在某個課堂停留的時間越長,學習效果就越好。請你計算一下它哪門課學的最好吧(我不會告訴你它經常去聽金老師的高等數學喲)。

輸入

輸入有多行。
每行包含三個數據,分別表示課堂名稱(長度不超過30個字符),學霸貓的出現時間和離開時間,這兩個時間都是指同一天。課堂名稱保證不重複。

輸出

輸出學霸貓學習效果最好的一門課的名稱和時長(具體格式見樣例輸出),佔一行,兩個數據間以空格分隔,末尾沒有空格。

樣例輸入 Copy
programming 14:00 15:30
math 8:00 8:10
樣例輸出 Copy
programming 1:30

細節:

由於循環無法出來(讀不到文件的結尾),所以要人爲的告訴它(調試的時候回車ctrl+z再回車),當然提交代碼後他後臺會自己處理。

代碼:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    char cname[30];
    int ah,am,lh,lm;
    int maxtime = -1;
    string maxcname;
    while(scanf("%s %d:%d %d:%d",cname,&ah,&am,&lh,&lm)!=EOF){
        int len = (lh-ah)*60+lm-am;
        if(len > maxtime){
            maxtime = len;
            maxcname = cname;
        }
    }
    if(maxtime%60>=10){
            cout<<maxcname<<" "<<maxtime/60<<":"<<maxtime%60;
    }else
        cout<<maxcname<<" "<<maxtime/60<<":"<<"0"<<maxtime%60;
    return 0;
}

在這裏插入圖片描述

更好的解法:

利用fgets讀一行放進一個buffer,
然後用sscanf去解析buffer,
再重新用fgets讀取下一行

#include <bits/stdc++.h>

using namespace std;
/*
fgets讀一行放進一個buffer,
然後用sscanf去解析buffer,
再重新用fgets讀取下一行


scanf是從標準輸入解析字符串,
sscanf是從給定的一個“字符數組”解析字符串
fgets保證讀取到test中的字符串一定是'\0'結尾的,
所以sscanf不論成敗,一定會停止
*/
int main()
{
    char cname[30];
    char test[50];
    int ah,am,lh,lm;
    int maxtime = -1;
    string maxcname;
    fgets(test, 50, stdin);
    while(sscanf(test, "%s %d:%d %d:%d", cname,&ah,&am,&lh,&lm)!=EOF){
        int len = (lh-ah)*60+lm-am;
        if(len > maxtime){
            maxtime = len;
            maxcname = cname;
        }
        fgets(test, 50, stdin);
    }
    if(maxtime%60>=10){
            cout<<maxcname<<" "<<maxtime/60<<":"<<maxtime%60;
    }else
        cout<<maxcname<<" "<<maxtime/60<<":"<<"0"<<maxtime%60;
    return 0;
}

爲什麼回車兩下就跳出while 了?

你第一次按回車,是把回車前面的字符串(比如“abc 15:30
16:30”)和換行符一起寫入test,再加個’\0’,然後sscanf解析這個字符串,OK沒問題,於是準備第二次fgets。你第二次按回車,同樣是把回車前面的字符和換行符一起寫入test,但是因爲回車前面沒有字符(你兩次回車是連着按的),所以寫入test的就是’\n’和一個’\0’,sscanf解析的時候會發現還沒遇到字符串(%s)呢,就到’\0’了,所以返回了EOF,循環結束

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章