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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值