51Nod-1804-小C的多边形

来源:互联网 发布:玩客云京东抢购软件 编辑:程序博客网 时间:2024/05/19 13:29

ACM模版

描述

描述

题解

这个题是一个构造体,只要发现了其中构造的规律即可。

一开始我画了半天 n=5 的情况,发现怎么找也找不出来可行解。于是尝试 n=6 的情况,找到了一组可行解 3 5 2 4 1,然后大胆的猜测,每隔一项差为1,注意取模,并且第二项为最大值,这样,只有当多边形是奇数边时才可以保证每一个边符合关系,那么也就意味着当点数 n 为奇数时无解。抱着侥幸心理直接写了一下,却 judge error 了……于是找了一下 JinbaoSite 的题解,发现我的确猜对了(具体推导过程请查看大神的题解吧),于是我尝试提交了一下该大神的代码,依然 judge error 让我很痛心……接着我花了 60 点头盾买了一个大神的 AC 代码瞅瞅,发现和我们思路是一样的,可是提交依然是 judge error,哎,我放弃了,因为问题不是我们的,网站可能出 bug 了吧……希望夹克老师能尽快解决这个问题,心疼我的点头盾啊……

注意,由于这个问题需要用到大量的输出,所以记住开输出外挂哦……

代码

#include <cstdio>#include <iostream>using namespace std;const int MAXN = 1e6 + 10;const int MAXM = 10;const int MAX_BUFF = 1 << 24;int A[MAXN];char s[MAX_BUFF];char tmp[MAXM];void intToChar(int &pos, int a){    int cnt = 0;    while (a)    {        tmp[cnt++] = a % 10;        a /= 10;    }    while (cnt != 0)    {        s[pos++] = tmp[--cnt] + '0';    }}int main(){    int n;    cin >> n;    n--;    if (n % 2 == 0)    {        cout << 0 << '\n';        return 0;    }    int k = 1, num = n;    while (1)    {        A[k] = num--;        if (k == n - 1)        {            break;        }        k = (k + 2);        if (k >= n)        {            k -= n;        }    }    int pos = 0;    for (int i = 1; i < n; i++)    {        intToChar(pos, i);        s[pos++] = ' ';    }    intToChar(pos, n);    s[pos++] = '\0';    puts(s);    pos = 0;    for (int i = 0; i < n - 1; i++)    {        intToChar(pos, A[i]);        s[pos++] = ' ';    }    intToChar(pos, A[n - 1]);    s[pos++] = '\0';    puts(s);    return 0;}
0 0