查看: 8083|回復: 0

[競賽分享] 常見的多測資輸入方式

[複製鏈接]
  • TA的每日心情
    開心
    2015-4-12 10:09
  • 簽到天數: 137 天

    [LV.7]常住居民III

    142

    主題

    686

    帖子

    3559

    積分

    邁向天堂

    蘇多門

    Rank: 8Rank: 8

    積分
    3559

    新手達陣台南一中資訊社程式設計達人 - 2014

    發表於 2014-12-7 17:00:57 | 顯示全部樓層 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    本帖最後由 domen111 於 2014-12-7 21:13 編輯

    Green Judge 有很完整的練習題: 公平的戰役
    TOJ上的練習題: 南極熊大遷徙

    一、T行版
    題目開頭給你一個數字T告訴你有T筆測資
    方法一,用for迴圈,簡單易理解的方法
    [C++] 純文本查看 復制代碼
    #include<iostream>
    using namespace std;
    int main()
    {
            int T;
            cin>>T;
            for(int i=0;i<T;i++)
            {
                    //code
            }
    }

    方法二,用while,比較不易理解,但好處是程式碼較短,且不會多一個變數i,避免以後for迴圈必須從j開始編號
    [C++] 純文本查看 復制代碼
    #include<iostream>
    using namespace std;
    int main()
    {
            int T;
            cin>>T;
            while(T--)
            {
                    //code
            }
    }
    每次while迴圈都會將T減1,直到T=0就結束
    二、0結尾版
    方法一,用無窮迴圈,直到0為止
    [C++] 純文本查看 復制代碼
    #include<iostream>using namespace std;
    int main()
    {
            while(1)
            {
                    int a,b; //測資資料
                    cin>>a>>b;
                    if(a==0&&b==0)
                            break;
                    //...
            }
    }
    方法二,更漂亮的寫法,省下好幾行,類似EOF版的寫法
    [C++] 純文本查看 復制代碼
    #include<iostream>
    using namespace std;
    int main()
    {
            int a,b; //測資資料
            while(cin>>a>>b && (a!=0||b!=0))
            {
                    //...
            }
    }

    其實也可以用「,」
    [C++] 純文本查看 復制代碼
    #include<iostream>
    using namespace std;
    int main()
    {
            int a,b; //測資資料
            while(cin>>a>>b, a!=0||b!=0)
            {
                    //...
            }
    }
    三、EOF版
    題目完全沒有告訴你總共有幾筆測資,也沒有說如何結尾,那該怎麼辦呢?
    用無窮迴圈一直讀嗎? 不行啊! 這樣會TLE的
    其實當測資檔結束時是有辦法在程式中偵測到的,那叫做EOF(End Of File)
    當cin讀到EOF時的回傳值能夠自動轉型成false,所以直接放在while裡就行了
    [C++] 純文本查看 復制代碼
    #include<iostream>
    using namespace std;
    int main()
    {
            int a,b; //測資資料
            while(cin>>a>>b)
            {
                    //...
            }
    }
    scanf的寫法:
    [C++] 純文本查看 復制代碼
    #include<cstdio>
    using namespace std;
    int main()
    {
            int a,b;
            while(scanf("%d %d",&a,&b)!=EOF)
            {
                    //...
            }
    }


    [C++] 純文本查看 復制代碼
    #include<cstdio>
    using namespace std;
    int main()
    {
            int a,b;
            while(~scanf("%d %d",&a,&b))
            {
                    //...
            }
    }
    那麼這樣要怎麼在本機自己測試呢?
    Windows底下在黑視窗裡面按下Ctrl+Z或Ctrl+X就相當於EOF,你們可以測試看看


    其他競賽常見的輸入方式可以參考這篇




    蘇多門 domen111
    My Web: https://sites.google.com/site/domenprg/
    回復

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表