P1014 Cantor表(模拟 细节)

题的链接:P1014 Cantor表

题解: 先找到那条斜线,右上到左下,让 t -= a, 再加 1 即可到达该斜线的第一个部位,再判断当前斜线编号的奇偶性,分情况令 c, d 分别取值,然后一个加一个减即可;
注意: 一个小坑点,不是每次都是从右上到左下,还有左下到右上,分为奇偶的情况,细节注意;第一次没看见已提交WA了,改了后就AC了。
参考代码1.0:
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
#define MAX 5010
using namespace std;

int N, t, a, c, d;

int main()
{
    cin >> N;
    while(t < N)
    {
        a++;
        t += a;
    }
    t -= a; t += 1;
    if(a % 2 == 0) {c = 1, d = a; for(int i = t; i < N; i++) c++, d--;}
    else {c = a; d = 1; for(int i = t; i < N; i++) c--, d++;}
    cout << c << "/" << d << endl;
    return 0;
}

参考代码2.0: for循环可以直接写成关于n的式子,少去了一步步循环的步骤;
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
#define MAX 5010
using namespace std;

int N, t, a, c, d;

int main()
{
    cin >> N;
    while(t < N)
    {
        a++;
        t += a;
    }
    t -= a; t += 1;
    if(a % 2 == 0) {c = 1; d = a; c += (N - t); d -= (N - t);}
    else {c = a; d = 1; c -= (N - t); d += (N - t);}
    cout << c << "/" << d << endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值