昨天感冒了,不太舒服,没怎么写代码。今天早上一起床赶快去看看那到该死的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;
}