码迷,mamicode.com
首页 > 其他好文 > 详细

luogu5823 课表的排列

时间:2019-12-17 20:40:57      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:mat   ios   数列   开始   pac   自己   problem   mes   solution   

题目链接

problem

构造一个长度为\(2n\)的数列。满足:
1.[1,n]中每个数字恰好出现两次。
2.将所有相同数字之间相隔的数字个数排序后,得到公差为1的等差数列。
保证n为奇数。

solution

挺妙的一道题(来自蒟蒻的呻吟~)

发现n是奇数。那么将序列分为四部分A,B,C,D。长度分别为k,k+1,k,k+1。让A与C互为相反串,B与D互为相反串。

这样发现,A与C所造成的贡献分别是:k+1,k+3,k+5···。B与D所造成的贡献分别是:k,k+2,k+4,k+6···。合起来恰好是一个等差数列。

一开始自己误加了一个条件(首项必须唯一/nc)

code

/*
* @Author: wxyww
* @Date:   2019-12-17 18:58:18
* @Last Modified time: 2019-12-17 19:08:10
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;

ll read() {
    ll x = 0,f = 1;char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1; c = getchar();
    }
    while(c >= '0' && c <= '9') {
        x = x * 10 + c - '0'; c = getchar();
    }
    return x * f;
}

int main() {
    int n = read();
    for(int i = 1;i <= n;++i) printf("%d ",i);
    for(int i = n / 2;i >= 1;--i) printf("%d ",i);
    for(int i = n;i > n / 2;--i) printf("%d ",i);

    return 0;
}

luogu5823 课表的排列

标签:mat   ios   数列   开始   pac   自己   problem   mes   solution   

原文地址:https://www.cnblogs.com/wxyww/p/luogu5823.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!