标签:print 排列 ref 序列 col 通过 cin -- style
https://ac.nowcoder.com/acm/contest/847/C
仅一行一个整数 n(1≤n≤100000) n(1≤n≤100000)。
8
6 3 7 2 0 5 1 4
10
8 4 9 1 3 0 6 2 5 7
答案可能不止一种。
解题:
起点是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 7
jump[i]:7 6 5 4 0 3 2 1
door[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; }
标签:print 排列 ref 序列 col 通过 cin -- style
原文地址:https://www.cnblogs.com/shoulinniao/p/10807016.html