67B_Restoration of the Permutation

2024-05-24 09:48
文章标签 permutation restoration 67b

本文主要是介绍67B_Restoration of the Permutation,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原题链接:http://codeforces.com/problemset/problem/67/B

分析:

       题目告诉了我们一种规则由a数组变成b数组。如

       A={5,1,4,2,3} ,k=2;   当我们求bi时,先到a数组找i=aj;a1-aj中有几个数是满足ax<=i+k的,满足的数的个数即为bi的值。

       求b1时,先找到1a数组中得位置,得到1左边的数 5;有5>=1+2;所以b1=1

       求b2时,先找到2a数组中得位置,得到1左边的数 51,4

              有5>=2+2;   4>=2+2  ; 所以b2=2;

        以此类推。

        当题目是给我们b数组,要我们求最小得字典序的a数组。我们可以想到这样一个事实,

    在b中第一个0出现的位置,放在a[1],这时候放b中最小的满足条件的值为1的值放在a[2]中(在程序中实现时更新b中得值,使满足aj>=i+k的b的下标cur(cur=aj)中得值减一)。

我的代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{int a[1005],b[1005];int n,k;while(scanf("%d%d",&n,&k)==2){for(int i=1;i<=n;i++) scanf("%d",b+i);for(int i=1;i<=n;i++){int cur=1;while(b[cur]!=0) cur++;  //找最近的0;a[i]=cur;b[cur]--;  //将放进了a中的数cur,变成b[cur]=-1,这样就标记了。for(int j=1;j+k<=cur;j++) b[j]--; //更新b数组。}for(int i=1;i<=n;i++) printf(i!=n?"%d ":"%d\n",a[i]);}return 0;
}

总结:练习的时候,看懂了从a怎么到b。当想不到怎么出b到a.


这篇关于67B_Restoration of the Permutation的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/998063

相关文章

【ZOJ】3874 Permutation Graph 【FFT+CDQ分治】

传送门:【ZOJ】3874 Permutation Graph 题目分析: 容易知道一个个连通块内部的标号都是连续的,否则一定会有另一个连通块向这个连通块建边,或者这个连通块向另一个连通块建边。而且从左到右左边的连通块内最大的标号小于右边连通块内最小的标号。 然后我们可以构造dp方程: dp[n]=n!−i!∗dp[n−i] \qquad \qquad dp[n] = n! - i! *

LeetCode 31 Next Permutation

题意: 给出一串数字,求该排列的下一个排列。如果该排列为字典序最大排列,则输出字典序最小排列。 思路: 首先C++里面有求下一个排列的函数next_permutation,该函数返回0即表示当前排列字典序最大。 如果要自己动手实现,那么就考虑“如何找到比当前排列大1的排列”。 假设排列A(aaaXddd)比排列B(aaaYfff)大1,a部分为两排列相同部分,X与Y表示最靠左边不同

String Permutation

Given two strings, write a method to decide if one is a permutation of the other. Example Example 1:Input: "abcd", "bcad"Output: TrueExample 2:Input: "aac", "abc"Output: False 思路:count比较一下就可以;

numpy.random中的shuffle和permutation

shuffle: 沿着第一个axis打乱子数组的顺序,但是内容不变,相当于沿着第一个axis把array切成n个sub-array,然后打乱sub-array的顺序。(如果只有一维就只打乱元素) >>> arr = np.arange(9).reshape((3, 3))>>> np.random.shuffle(arr)>>> arrarray([[3, 4, 5],[6, 7, 8]

numpy.random.permutation

随机排列一个序列,返回一个排列的序列。 >>> np.random.permutation(10) array([1, 7, 4, 3, 0, 9, 2, 5, 8, 6]) >>> np.random.permutation([1, 4, 9, 12, 15]) array([15,  1,  9,  4, 12]) >>> arr = np.arange(9).reshape((3, 3))

Java实现STL中的全排列函数next_permutation()

目录 一、引言 二、全排列函数next_permutation() 三、next_permutation()的使用 四、Java实现next_permutation() 五、使用next_permutation()实现全排列 一、引言 相信很多小伙伴们都做过全排列的算法题,输入一个n,输出1~n的全排列。对于这个问题,最经典的是实现方法应该是通过回溯实现 。 代码如下 i

数据分析:置换检验Permutation Test

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 介绍 置换检验是一种非参数统计方法,它不依赖于数据的分布形态,因此特别适用于小样本数据集,尤其是当样本总体分布未知或不符合传统参数检验的假设条件时。置换检验的基本思想是通过随机置换样本来评估观察到的统计量是否显著不同于随机情况下的预期值。最初真正认识置换检

博弈论+递推+调和级数枚举,CF 1033C - Permutation Game

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1033C - Permutation Game 二、解题报告 1、思路分析 我们考虑一个位置符合什么条件可以必胜? 如果可以跳到一个必败的位置 考虑最大的格子一定是必败 而每个格子只能跳到比自己大的格子 于是我们就可以倒序处理状态 对于每个格子枚举比自己大

484. Find Permutation

https://leetcode.com/problems/find-permutation/description/ 题目大意:给一串DDII…D代表下降趋势,I代表上升.根据这一串DDII的序列构建出一个整数vector,且若有多个vector符合要求,返回字典序最小的. 解题思路:根据讨论的思路,首先构建出完全增序(IIII….)的序列1,2,3,4,…n,然后找序列中所有的D,将对应位