昨天感冒了,不太舒服,沒怎麼寫代碼。今天早上一起牀趕快去看看那到該死的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;
}