oj 1031 random permutation

Problem A: Random Permutations

Time Limit: 1
Sec  Memory Limit: 128 MB Submit:
91  Solved: 54

Description

随机排列生成算法 (运行a.exe输出数字的个数,运行a.exe test时输出为一次随机的排列)

Input

The input will be a list of integers

Output

The number of the integers

Sample Input

1 2 3 4 5 6 7 8 9 10

Sample Output

10

思路:产生元素数目为n的无重随机数列

—>产生随机数,确定不重复后才加入数组

—>确定不重复用循环?循环后如何有把握新的数也无重复?

—>两层?三层?不保险

—>递归?写一写,三个函数,赋值,比较,主函数

—>搞定


 1 #include<iostream>
2 #include<cstdlib>
3 #include<ctime>
4 using namespace std;
5 int seed=time(0);
6 int b[50]={0};
7 int test(int b[],int i,int temp)
8 {
9 for (int j=0;j<i;j++)
10 {
11 if (b[j]==temp) return -1;
12 }
13 return 0;
14 }
15 void give_test(int b[],int temp,int i,int n)
16 {
17 seed++;
18 srand(seed);
19 temp=rand()%n;
20 if (test(b,i,temp)==-1)
21 {
22 seed++;
23 give_test(b,temp,i,n);
24 }
25 else b[i]=temp;
26 }
27 void random_permute(int a[],int n)
28 {
29 srand(seed);
30 b[0]=rand()%n;
31 int temp=0;
32 for (int i=1;i<n;i++)
33 {
34 give_test(b,temp,i,n);
35 }
36 for (int i=0;i<n;i++)
37 cout<<a[b[i]]<<" ";
38 }
39 int main(int argc,char *argv[])
40 {
41 int n;
42 cin>>n;
43 int a[50];
44 for (int i=0;i<n;i++)
45 cin>>a[i];
46 random_permute(a,n);
47 cout<<n<<endl;
48 return 0;
49 }

验证可行

—>修改符合oj设计(argc,argv……受不了了,先睡……改天再说)

—>拓展:http://www.cnblogs.com/eaglet/archive/2011/01/17/1937083.html 不经过如此多比较去重的较高效算法

oj 1031 random permutation,布布扣,bubuko.com

时间: 2024-10-13 11:12:11

oj 1031 random permutation的相关文章

numpy random.shuffle()和random.permutation()

这两个方法都是打乱一个随机地打乱一个数组,他们的语法如下: np.random.shuffle(x),这里的参数x要求为array-like或者是一个list,没有返回值 np.random.permutation(x), 这里的参数x可以是array-like或者是一个int,如果是int就等价与传入np.arange(x),返回打乱的数组 他们二者的区别就在于shuffle是就地打乱数组,就是说传入的数组x被打乱,而permutation是打乱复制的x的数组,然后返回这个复制被打乱的数组,而

Light OJ 1031 - Easy Game(区间dp)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1031 题目大意:两个选手,轮流可以从数组的任意一端取值, 每次可以去任意个但仅限在一端, 他们的得分分别是取得所有值的和.现在求这两个选手得分差值的最大值. 解题思路:设dp[i][j]代表从i到j这个区间中,所能够得到的最大差值,只需要枚举其中i到j之间的一个数c,作为断电,那么最大值应该为max(sum[c]-sum[i-1]-dp[c+1][j], sum[j]-sum

九度OJ 1031 xxx定律

题目1031:xxx定律 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4995 解决:3187 题目描述:     对于一个数n,如果是偶数,就把n砍掉一半:如果是奇数,把n变成 3*n+ 1后砍掉一半,直到该数变为1为止. 请计算需要经过几步才能将n变到1,具体可见样例. 输入:     测试包含多个用例,每个用例包含一个整数n,当n为0 时表示输入结束.(1<=n<=10000) 输出:     对于每组测试用例请输出一个数,表示需要经过的步数,每组输出占一行. 样例输入:

九度oj 1031 xxx定律 2009年浙江大学计算机及软件工程研究生机试真题

题目1031:xxx定律 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5153 解决:3298 题目描述:     对于一个数n,如果是偶数,就把n砍掉一半:如果是奇数,把n变成 3*n+ 1后砍掉一半,直到该数变为1为止.    请计算需要经过几步才能将n变到1,具体可见样例. 输入:     测试包含多个用例,每个用例包含一个整数n,当n为0 时表示输入结束.(1<=n<=10000) 输出:     对于每组测试用例请输出一个数,表示需要经过的步数,每组输出占一行. 样例输

LeetCode OJ:Next Permutation(下一排列)

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). The replaceme

LeetCode OJ 31. Next Permutation

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). The replaceme

Light OJ 1031 - Easy Game(区间DP)

题目大意: 给你一个n,代表n个数字,现在有两个选手,选手A,B轮流有有一次机会,每个选手一次可以得到一个或者多个数字,从左侧或者右侧,但是不能同时从两边取数字,当所有的数字被取完,那么游戏结束.然后计算每个选手所得到数字的总和,每个选手都尽量让自己的分数比较多,选手A先开始取数.假设每个选手取得数字都是最优的,问A最多比B多多少分数,. 题目分析: 记忆化搜索,区间DP. dp[该谁取了][左区间L][右区间] = 所能取到的最大值. 做下简单的预处理,得到区间L-R之间的和. 然后状态转移

light oj 1031(数位DP)

求一段区间中,每个十进制数所对应的二进制数中连续的1的个数之和. 设dp[i][0]代表长度为i的二进制数,首位为0,所含有的连续的1的个数之和. dp[i][1]代表长度为i的二进制数,首位为1,所含有的连续的1的个数之和. a: d[i][1]=d[i-1][0]+d[i-1][1]+(1<<(i-2)); b: d[i][0]=d[i-1][0]+d[i-1][1]; 这里面有一个需要注意的地方是,假设有一个数字是111,那么它含有2个连续的1,具体体现在 方程上是分两次计算的,一个是a

numpy的random模块

[说明] 翻译自官网的文档. 随机抽样 (numpy.random) 简单的随机数据 rand(d0, d1, ..., dn) 随机值 >>> np.random.rand(3,2) array([[ 0.14022471, 0.96360618], #random [ 0.37601032, 0.25528411], #random [ 0.49313049, 0.94909878]]) #random randn(d0, d1, ..., dn) 返回一个样本,具有标准正态分布.