Buy Fruits-(构造)

https://ac.nowcoder.com/acm/contest/847/C

在blueland上有 n n个水果店,它们的编号依次为 0,1,2...n−1 0,1,2...n−1。奇妙的是,每个水果店都只卖一种水果,且这些水果店卖的水果种类都各不相同。

在每个水果店有一个传送门,且这些传送门也有各自的编号,其中 i i号水果店的传送门编号为 Ai Ai,每个传送门的编号也各不相同,且是 [0,n−1] [0,n−1]中的一个整数。简单的说, A0A1A2...An−1 A0A1A2...An−1 0∼n−1 0∼n−1的一个排列

lililalala初始位于 0 0号水果店,现在他想买到全部的 n n种水果,但是他并不认识路,所以只能通过传送门往来于水果店并通过固定的流程买水果:

当他到达 i i号水果店时,如果之前没有到过这个水果店,那么lililalala会买下这种水果并且通过这个水果店的传送门传送到 (i+Ai)modn (i+Ai)modn号水果店;

如果之前已经到过这个水果店,那么他就立即停止买水果的流程。

请输出一种使得lililalala可以买到全部 n n种水果的一种传送门编号序列,或者判定不存在这样的序列。

输入描述:

仅一行一个整数 n(1≤n≤100000) n(1≤n≤100000)。

输出描述:

如果存在符合题目要求的序列:

输出一行 n n个整数--符合题目要求的序列,如果有多个序列满足要求,输出任意一个即可。

输出需要保证:

∀i∈[0,n−1],Ai∈[0,n−1]∀i∈[0,n−1],Ai∈[0,n−1]

∀i,j∈[0,n−1],满足Ai≠Aj如果i≠j∀i,j∈[0,n−1],满足Ai≠Aj如果i≠j

如果不存在符合题目要求的序列,输出 −1 −1。

示例1

输入

8

输出

6 3 7 2 0 5 1 4

说明

lililalala经过水果店的顺序是:

0→6→7→3→5→2→1→4 0→6→7→3→5→2→1→4

答案可能不止一种。

示例2

输入

10

输出

8 4 9 1 3 0 6 2 5 7

说明

lililalala经过水果店的顺序是:

0→8→3→4→7→9→6→2→1→5 0→8→3→4→7→9→6→2→1→5

答案可能不止一种。解题:起点是0,传送到(n-1)号店,再传送到1号店,再传送到n-2号店,再传送到2号店,以此类推,直到n/2传送回0。
数组jump存储传送到的店号,数组存储传送门的编号,i表示当前水果店(i+door[i])%n=jump[i]逆推door[i]:(i+door[i])/n=x;door[i]=x*n+jump[i]-i;手撸n为偶数的情况,前后跳。
比如:n=8下标i:  0 1 2 3 4 5 6 7jump[i]:7 6 5 4 0 3 2 1door[i]:7 5 3 1 0 6 4 2显然n/2前面的x都为0,n/2后面的x都为1,n/2特判。手撸n为奇数的情况,举例n=3,5,撸不出来。直接输出-1。提交一发wa后想到特判n=1的情况。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;

int n;
int jump[100005];///传送到的店号
int door[100005];///传送门的编号

int main()
{
    while(cin>>n)
    {
        if(n==1)
            printf("0\n");
        else if(n%2)
            printf("-1\n");
        else
        {
            int len=n/2;
            for(int i=0;i<n;i++)
            {
                if(i<len)
                {
                    jump[i]=n-1-i;
                }
                else if(i==len)
                    jump[i]=0;
                else
                    jump[i]=n-i;
            }
            for(int i=0;i<n;i++)
            {
                if(i<len)
                {
                    door[i]=jump[i]-i;
                }
                else if(i==len)
                    door[i]=0;
                else
                    door[i]=n+jump[i]-i;

            }
            /*打印观察规律
            for(int i=0;i<n;i++)
            if(i!=n-1)
                printf("%d ",i);
            else
                printf("%d\n",i);
            for(int i=0;i<n;i++)
            if(i!=n-1)
                printf("%d ",jump[i]);
            else
                printf("%d\n",jump[i]);
            */
            for(int i=0;i<n;i++)
            if(i!=n-1)
                printf("%d ",door[i]);
            else
                printf("%d\n",door[i]);
        }
    }
    return 0;
}

 

原文地址:https://www.cnblogs.com/shoulinniao/p/10807016.html

时间: 2024-10-15 08:59:06

Buy Fruits-(构造)的相关文章

java枚举小结

在百度百科上是这样介绍枚举的: 在C#或C++,java等一些计算机编程语言中,枚举类型是一种基本数据类型而不是构造数据类型,而在C语言等计算机编程语言中,它是一种构造数据类型.枚举类型用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型. 而在java中,枚举扩大了这一概念,因为在java中,枚举已经称为一个类,因此完全具有类的特性. 我们都知道枚举是JDK1.5才推出的新概念,那么在此之前,我们如果想使用一些固定的常量集合,比如性别(2个),季节(4个),星期(7个)

CodeForces 12C Fruits

Fruits Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 12C Description The spring is coming and it means that a lot of fruits appear on the counters. One sunny day little boy Valera deci

解题报告Best Time to Buy and Sell Stock with Cooldown

题目 Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times)

CodeForces 404C Restore Graph (构造)

题意:让人构造一个图,满足每个结点边的数目不超过 k,然后给出每个结点到某个结点的最短距离. 析:很容易看出来如果可能的话,树是一定满足条件的,只要从头开始构造这棵树就好,中途超了int...找了好久. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include

121.买卖股票 Best Time to Buy and Sell Stock

Say you have an array for which the ith element is the price of a given stock on day i. If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit. Exam

[.net]基元线程同步构造

1 /* 基元线程同步构造 2 用户模式构造: 3 易变构造(Volatile Construct) 4 互锁构造(Interlocked Construct):自旋锁(Spinlock) 乐观锁(Optimistic Concurrency Control,乐观并发控制) 5 内核模式构造: 6 事件构造(Event) 7 信号量构造(Semaphore) 8 互斥体构造(Mutex) 9 */ 10 11 //易变构造,Volatile.Write()之前的所有字段写入操作,必须再该方法调用

C++基础3 类:构造 拷贝 析构函数,

为什么会出现构造函数 与 析构函数 [email protected]:~/c++$ cat main.cpp  #include <iostream> #include <stdlib.h> #include <string.h> using namespace std; class Test { public: void init() { a = 1; b = 2; } private: int a; int b; }; int main() { Test arr[

继承的构造和析构顺序

程序示例 1 #include <iostream> 2 using namespace std; 3 class a 4 { 5 public: 6 a(){cout<<"构造a"<<endl;} 7 ~a(){cout<<"析构a"<<endl;} 8 }; 9 class b 10 { 11 public: 12 b(){cout<<"构造b"<<endl;

基于mezzanine的攻防比赛环境搭建及漏洞构造

虚拟部署 virtualenv是python环境配置和切换工具,进入该虚拟环境后,pip安装的软件不影响当前主环境,这样就能很好的安装几个python版本了,解决了库之间的依赖关系. 安装virtualenv和pipsudo apt-get install python-virtualenv python-pip 创建虚拟部署环境 [email protected]:~$virtualenv -p /usr//bin/python2.7 app [email protected]:~$ cd a