hdoj 2404 Permutation Recovery

Permutation Recovery

Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 456    Accepted Submission(s): 316

Problem Description

Professor Permula gave a number of permutations of the n integers 1, 2, ..., n to her students. For each integer i (1 <= i <= n), she asks the students to write down the number of integers greater than i that appears before i in the given permutation. This number is denoted ai. For example, if n = 8 and the permutation is 2,7,3,5,4,1,8,6, then a1 = 5 because there are 5 numbers (2, 7, 3, 5, 4) greater than 1 appearing before it. Similarly, a4 = 2 because there are 2 numbers (7, 5) greater than 4 appearing before it.

John, one of the students in the class, is studying for the final exams now. He found out that he has lost the assignment questions. He only has the answers (the ai‘s) but not the original permutation. Can you help him determine the original permutation, so he can review how to obtain the answers?

Input

The input consists of a number of test cases. Each test case starts with a line containing the integer n (n <= 500). The next n lines give the values of a1, ..., an. The input ends with n = 0.

Output

For each test case, print a line specifying the original permutation. Adjacent elements of a permutation should be separated by a comma. Note that some cases may require you to print lines containing more than 80 characters.

Sample Input

8
5
0
1
2
1
2
0
0

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

Sample Output

2,7,3,5,4,1,8,6

10,9,8,7,6,5,4,3,2,1

题意:给你一个序列 如2,7,3,5,4,1,8,6  a1=5代表1前边比1大的数的个数为5 (2 7 3 5 4)a4=2代表4前边比4大的数的个数为2个(7  5)现在给你每个数前边比这个数大的数的个数让你求出这个序列

题解:因为所给的数都是按照1~n的顺序给的,所以我们可以看做有n个空格 可以根据这个顺序来向空格中放数,首先,当输入0时代表前边没有比它自己大的数则证明前边的空格都已放满,此时找到数组a的

第一个0的位置就是这个数的位置,如果输入的数k不为0则证明这个数前边还有k个比自己大的数,那么找到第k+1个0的位置,就是这个数的位置

#include<stdio.h>
#include<string.h>
#define MAX 510
int a[MAX];//输入数据
int main()
{
	int n,m,j,i,k,t;
	while(scanf("%d",&n),n)
	{
		memset(a,0,sizeof(a));
	    for(i=1;i<=n;i++)
	    {
	    	scanf("%d",&k);
	    	int ok=0;
	    	for(j=1;j<=n;j++)
	    	{
	    		bool flag=false;
	    		if(k==0)
	    		{
	    			for(t=1;t<=n;t++)
	    			{
	    				if(a[t]==0)
	    				{
	    					a[t]=i;
	    					flag=true;
	    					break;
	    				}
	    			}
	    			if(flag)
	    			    break;
	    		}

	    		else
	    		{
	    			if(a[j]==0)
	    			    ok++;
	    			if(ok==k+1)
	    			{
	    				a[j]=i;
	    				break;
	    			}
	    		}
	    	}
	    }
	    for(i=1;i<n;i++)
	       printf("%d,",a[i]);
	    printf("%d",a[n]);
	    printf("\n");
	}
	return 0;
}

  

时间: 2024-12-26 19:17:35

hdoj 2404 Permutation Recovery的相关文章

数论+DP HDOJ 4345 Permutation

题目传送门 题意:一个置换群,经过最少k次置换后还原.问给一个N个元素,在所有的置换群里,有多少个不同的k. 分析:这道题可以转化成:N = Σ ai ,求LCM ( ai )有多少个不同的值.比如N=10时,k可为:1,2,3,2*2,5,2*3,7,2*2*2,3*3,2*5,2*2*3,2*7,3*5,2*2*5,3*7,2*3*5,共16个,这里用到了唯一分解定理:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式.例如:  .那么先预处理出1000内的素

Yandex Algorithm 2018 Qualification

A. Lottery code: 1 /* 2 by skydog 3 */ 4 #include <iostream> 5 #include <cstdio> 6 #include <vector> 7 #include <utility> 8 #include <algorithm> 9 #include <cmath> 10 #include <cstring> 11 #include <map> 12

通过ipv6访问 g o o g l e

Google.Youtube.Facebook等均支持IPv6访问,IPv4网络的用户大部分都无法访问,比如Gmail,Google Docs等等各种相关服务.而该类网站大部分均已接入IPv6网络,因此通过IPv6访问则不受任何限制,尤其是对教育网用户来说,使用IPv6更是免费的服务. 而接入IPv6网络,也不仅仅只有教育网用户才能享受,普通公网用户也都可以通过隧道或软件来接入IPv6网络,但根据所处的网络环境.接入方式,访问IPv6的速度通常取决于本地网络宽带提供商与所接入的IPv6隧道服务器

【HDOJ】4345 Permutation

即求P1^n1+P2^n2 + ... + Pk^nk <= n,其中Pk为素数的所有可能组合.思路是DP.1~1000的素数就不到200个.dp[i][j]表示上式和不超过且当前最小素数为P[j]的所有可能情况.注意dp[i][0]+1即为所求. 1 /* 4345 */ 2 #include <iostream> 3 #include <sstream> 4 #include <string> 5 #include <map> 6 #include

【HDOJ】4985 Little Pony and Permutation

水题. 1 #include <cstdio> 2 3 #define MAXN 100005 4 5 int buf[MAXN], n; 6 7 int main() { 8 int i, j, k; 9 10 while (scanf("%d", &n) != EOF) { 11 for (i=1; i<=n; ++i) 12 scanf("%d", &buf[i]); 13 for (i=1; i<=n; ++i) {

逆序数2 HDOJ 1394 Minimum Inversion Number

题目传送门 1 /* 2 求逆序数的四种方法 3 */ 1 /* 2 1. O(n^2) 暴力+递推 法:如果求出第一种情况的逆序列,其他的可以通过递推来搞出来,一开始是t[1],t[2],t[3]....t[N] 3 它的逆序列个数是N个,如果把t[1]放到t[N]后面,逆序列个数会减少t[1]个,相应会增加N-(t[1]+1)个 4 */ 5 #include <cstdio> 6 #include <cstring> 7 #include <algorithm>

记录一次ceph recovery经历

一次ceph recovery经历 背景 这是一个测试环境. 该环境中是cephfs 一共12个节点, 2个client.2个mds.8个osd mds: 2颗CPU,每个4核,一共是8核. 128G内存, 单独的两个节点,只作为mds cpu型号: Intel(R) Xeon(R) CPU E5-1620 v3 @ 3.50GHz osd节点, 每个24核, 8 × 4T SATA盘, 1 SSD:INTEL SSD SC2BB48 (480G) 64G内存 cpu型号: Intel(R) X

关于RECOVERY清除数据的分析

[前言] 讨论:双清和清空所有数据的问题 说明:以前写的帖子都写三清,那个是为了保险起见才叫大家三项清除,毕竟人都有刚开始的时候,但看了郭贤普的帖子<系统与数据兼容性测试>之后,我觉得有必要说说这个问题,顺便说说双系统共存的时候为什么切换系统要清空所有数据. [分析内容] 分析关键名词:清空缓存.清空用户数据.清空所有数据[点这里是郭贤普帖子] 一.清空缓存 安卓手机的cache(缓存),如果是计算机它的功能就是CPU与内存数据交换的一个中介存储,但是在安卓手机上它也是一样的道理,就如郭贤普所

【HDOJ】4328 Cut the cake

将原问题转化为求完全由1组成的最大子矩阵.挺经典的通过dp将n^3转化为n^2. 1 /* 4328 */ 2 #include <iostream> 3 #include <sstream> 4 #include <string> 5 #include <map> 6 #include <queue> 7 #include <set> 8 #include <stack> 9 #include <vector>