ACM練習之《P1333Cantor表》

昨天感冒了,不太舒服,沒怎麼寫代碼。今天早上一起牀趕快去看看那到該死的KMP題過沒有。。不幸的是服務器仍舊維護中…

    轉戰VIJOS據說我的兩個隊友都在這刷題,學長告訴我做做數論就行了,剛好這個網站可以找不同類型的題。第一道題:《P1629八》感覺也不是很難啊,兩三個小時(好吧,原諒我是新手+忘得差不多了+有點笨)搞出來,提交,又有兩個點超時。。以我自己的方式“優化”一下,還是超時。看下討論,果然TM還要學個新東西,算啦算啦,讓我休息休息吧,雖然我做的題少,但也很辛苦好不好。。。委屈

    決定找個簡單的先做做,就當休息放鬆了,找個通過率比較高的《P1333Cantor表》第一眼看上去當然不知所云。。既然通過率那麼高,慢慢研究吧。考慮到會不會再出現TLE的情況,想了個絕招:整一個大數組生成所有結果,你要哪個我給你拿哪個。得意不到一分鐘發現好像沒有什麼類型符合“n/m”這種輸出格式 - -。還是老老實實找規律吧。終於被我發現可以用遞歸算第n斜行之前的元素總數。果然是突破點,複習了一下遞歸後手工測試無誤,想想這道題還真是簡單,運氣好說不定終於一次AC了,提交,太好了沒有TLE,可是隻對了兩個答案,三個錯誤,這兩個答案還不連續。鬱悶,看討論,發現有人說“忽略了Z字形”,額。。好吧我也忽略了 - -。

改回來,再提交。哇哈哈,終於簡單通過一個了哭鼓掌。截屏留紀念(原諒我小小自戀一下)



附上解題代碼:

#include <iostream>

using namespace std;
int num(int n)
{
    if (n==1)
        return 1;
    else
        return ( num(n-1) + n );
}
int main()
{
    int n , i , can ;
    while(cin >> n)
    {
        for ( i = 1 ; i < 4473; i ++)
            if( n <= num(i) )
            {
                can = num(i) ;
                break;
            }
        if( i % 2 == 0)
            cout << i - ( can - n ) <<'/' << (can - n) + 1  << endl;
        else
            cout << (can - n) + 1 << '/' << i - ( can - n ) << endl;
    }
    return 0;
}



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