51 nod 1804 小C的多边形(贪心)

来源:互联网 发布:软件开发运维驻场合同 编辑:程序博客网 时间:2024/05/18 19:37

1804 小C的多边形
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
 收藏
 关注
小C偶然发现了一个奇妙的n个点的多边形。现在你需要给外圈的边标记上1~n-1,里圈的边也标记上1~n-1,使得对于一个外圈相邻点与中间点构成的三角形的边权之和都相等。
图中带三角形的三个点构成的三角形的边权都要相等。
你需要输出一种标记方案。(如果不存在就输出0)
Input
一共一行。第一行,有一个n(4<=n<=1,000,000)。
Output
第一行n-1个数表示顺时针方向外圈的的边权(ai)。第二行n-1个数表示顺时针方向里圈的的边权(bi)。并且a1和b1,b2构成第1个三角形,a2和b2,b3构成第2个三角形....,an-1和bn-1,b1构成第n-1个三角形。具体请参看样例!
Input示例
4
Output示例
1 2 32 3 1

直接贪心将最小的边匹配最大的边即可

O(N)给我T了。。。最后加了挂


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <bits/stdc++.h>using namespace std;const int N = 1e6+10;typedef long long LL;LL a[N], b[N];inline void write(LL x){if(x>=10)write(x/10);putchar(x%10+'0');}int main(){    LL n;    scanf("%lld", &n);    LL x=((1+(n-1))*(n-1))/2*3;    if(x%(n-1)!=0) cout<<0<<endl;    else    {        x=x/(n-1);        a[1]=1,a[2]=2;        b[1]=x-1-(n-1),b[2]=n-1;        for(LL i=2;i<=n-1;i++)        {            a[i]=i;            b[i+1]=x-b[i]-i;        }        for(LL i=1;i<=n-2;i++)        {            write(a[i]);            putchar(' ');        }        write(a[n-1]);        puts("");        for(LL i=1;i<=n-2;i++)        {            write(b[i]);            putchar(' ');        }        write(b[n-1]);        puts("");    }    return 0;}









原创粉丝点击