CF 275(div.1) A Diverse Permutation

Diverse Permutation

题意:一个1~n的无重复整数序列,要求打印其中一种排列,使新序列相邻两项之差的绝对值去重后的个数刚好为k个

       (1 <= k < n <= 10^5)

输入:n,k

输出:新序列

思路:想了一下,先考虑k最大和k最小取值时的序列排列情况

      1) k最大时:k = n-1  序列:1,n,2,n-1,3,n-2.... 相邻两项绝对值差:n-1,n-2,n-3...1

      2) k最小时:k = 1     序列:1,2,3...n | n,n-1,n-2...1

      k取值为 [1,n-1] 那么中间的取值就这两个情况进行组合,前段用1),剩下数用2)

       当k为奇数时,2)用升序;当k为偶数时,2)用降序

 好,撸代码

 1 package golao.org.cf275;
 2
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStreamReader;
 6 import java.util.Arrays;
 7 import java.util.StringTokenizer;
 8
 9 public class DiversePermutation {
10
11     public static void main(String[] args) throws IOException {
12         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
13         StringTokenizer stk = new StringTokenizer(br.readLine());
14         int n,k;
15         n = Integer.parseInt(stk.nextToken());
16         k = Integer.parseInt(stk.nextToken());
17         System.out.println(print(findPermutation(n,k)));
18
19     }
20     public static int[] findPermutation(int n,int k)
21     {
22         int[] ary = new int[n];
23         for(int i=1;i<=n;i++){
24             ary[i-1] = i;
25         }
26         int[] aryResult = new int[n];
27         int count = n-1;
28         //前段
29         for(int j=1,i=0;j<=k;j+=2,i++){
30             aryResult[j-1] = ary[i];
31             aryResult[j] = ary[count--];
32         }
33         //后段
34         if(k%2==0){
35             for(int index=k;index<n;index++){
36                 aryResult[index] = ary[count--];
37             }
38         }else{
39             for(int index=k;index<n;index++){
40                 aryResult[index] = aryResult[index-1]+1;
41             }
42         }
43         return aryResult;
44     }
45     public static String print(int[] ary){
46         StringBuffer sb = new StringBuffer("");
47         for(int i=0;i<ary.length;i++){
48             sb.append(ary[i]);
49             sb.append(" ");
50         }
51         return sb.toString();
52     }
53
54 }

提交给CF,运行通过,77ms

时间: 2024-10-29 19:05:30

CF 275(div.1) A Diverse Permutation的相关文章

Codeforces Round #275 (Div. 1)A. Diverse Permutation 构造

Codeforces Round #275 (Div. 1)A. Diverse Permutation Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/482/problem/A Description Permutation p is an ordered set of integers p1,   p2,   ...,   pn, consisting of n distinct posi

Codeforces Round #275 (Div. 2) C - Diverse Permutation (构造)

题目链接:Codeforces Round #275 (Div. 2) C - Diverse Permutation 题意:一串排列1~n.求一个序列其中相邻两项差的绝对值的个数(指绝对值不同的个数)为k个.求序列. 思路:1~k+1.构造序列前段,之后直接输出剩下的数.前面的构造可以根据,两项差的绝对值为1~k构造. AC代码: #include <stdio.h> #include <string.h> int ans[200010]; bool vis[100010]; i

Codeforces Round #275 (Div. 1)A. Diverse Permutation (水)

题意: 从1-n的数,让你选择一些数来构造,要求每个相邻的数之间的绝对值之差有k种 题解: 先放好一个1   然后往后面插数字   先满足绝对值不同的  然后全插绝对值为1的, 代码: #include<stdio.h> #include<string.h> int main() { int n, k, a[100005], mark[100005]; while(scanf("%d %d", &n, &k) != EOF) { memset(a

CF #371 (Div. 2) C、map标记

1.CF #371 (Div. 2)   C. Sonya and Queries  map应用,也可用trie 2.总结:一开始直接用数组遍历,果断T了一发 题意:t个数,奇变1,偶变0,然后与问的匹配. #include<bits/stdc++.h> #define max(a,b) a>b?a:b #define F(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(a)) #define INF

CF#247(Div. 2)部分题解

引言: 在软件项目中,Maven提供了一体化的类库管理系统,非常实用.但是,如果新增的类库jar在网络上无法获取到,如何在本地按照Maven的规则添加进来呢?本文将通过一个小例子展示新增过程. 背景介绍: 一个Maven管理的Java项目,提供一个系统级别的POM.xml,其中定义了整个项目使用的类库. 需求: 需要添加一个自定义的类库到当前项目中.假定当前的类库文件名为:abc.jar.. 如何将类库添加进来? 1.  找到当前Maven的Repository类库位置 一般默认情况下,在win

CF #375 (Div. 2) D. bfs

1.CF #375 (Div. 2)  D. Lakes in Berland 2.总结:麻烦的bfs,但其实很水.. 3.题意:n*m的陆地与水泽,水泽在边界表示连通海洋.最后要剩k个湖,总要填掉多少个湖,然后输出. #include<bits/stdc++.h> #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,s

Codeforces Round #275 (Div. 2)

链接:http://codeforces.com/contest/483 A. Counterexample time limit per test 1 second memory limit per test 256 megabytes Your friend has recently learned about coprime numbers. A pair of numbers {a,?b} is called coprime if the maximum number that divi

CF #374 (Div. 2) D. 贪心,优先队列或set

1.CF #374 (Div. 2)   D. Maxim and Array 2.总结:按绝对值最小贪心下去即可 3.题意:对n个数进行+x或-x的k次操作,要使操作之后的n个数乘积最小. (1)优先队列 #include<bits/stdc++.h> #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(

cf #254 (Div. 2)

a题 #include<stdio.h> #include<string.h> char c[101][101]; int main() { long n,m,i,j; scanf("%ld%ld",&n,&m); gets(c[0]); for(i=1;i<=n;i++) gets(c[i]); for(i=1;i<=n;i++) { for(j=0;j<m;j++) if(c[i][j]=='-') printf("