随机生成数组函数+nth-element函数

时间:2021-07-29 05:09:05

这几天做了几道随机生成数组的题,且需要用nth-elemeng函数,并且都是北航出的多校题……

首先我们先贴一下随机生成数组函数的代码:

 unsigned x = A, y = B, z = C;
unsigned rng61() {
unsigned t;
x ^= x << ;
x ^= x >> ;
x ^= x << ;
t = x;
x = y;
y = z;
z = t ^ x ^ y;
return z;
}

这个函数的原理原谅我不太懂,就不多说了-_-||。

接下来来谈一下stl中的一个nth_element函数,这个函数对于一个数组、容器(我们就用最普通的数组a来进行讨论),假设我们需要求这个数组中的第k个元素,那么我们只需nth_element(a,a+k,a+n)(下标从0开始),那么a中第k小的数将会出现在第k个位置,且能够保证前k-1个元素都比它小,后面的元素都比它大(但是这两堆数是无序的),复杂度为O(n),该函数的一般用法为:nth_element(开始位置,所求位置,结束位置)。stl是个神奇的东西,里面还有max_element,min_element函数,具体用法请点击链接:http://www.cnblogs.com/Dillonh/p/9042456.html。

顺便贴一下这几天做的两道题:

第一道为昨天牛客多校的J题Heritage of skywalkert,题目链接:https://www.nowcoder.com/acm/contest/144/J

题目:

随机生成数组函数+nth-element函数

随机生成数组函数+nth-element函数

随机生成数组函数+nth-element函数

题意:用随机生成数组函数生成n个数,求这n个数中两两的lcm(最小公倍数)的最大值,n的范围为2e6.

思路:虽说要n个,但是我们只需要取出100个最大的即可,因为据证明两个数互质的概率为随机生成数组函数+nth-element函数(具体证明请自行百度),所以我们只需将这100个数求次lcm即可。

代码实现如下:

 #include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;;
typedef pair<int, int> pii;
typedef unsigned long long ull; #define lson i<<1
#define rson i<<1|1
#define bug printf("*********\n");
#define FIN freopen("D://code//in.txt", "r", stdin);
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define IO ios::sync_with_stdio(false),cin.tie(0); const double eps = 1e-;
const int mod = ;
const int maxn = 1e7 + ;
const double pi = acos(-);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f; int tt, n;
unsigned int x, y, z;
ull num[maxn]; unsigned int tang() {
unsigned t;
x ^= x << ;
x ^= x >> ;
x ^= x << ;
t = x;
x = y;
y = z;
z = t ^ x ^ y;
return z;
} ull gcd(ull a, ull b) {
return b == ? a : gcd(b, a % b);
} int main() {
//FIN;
scanf("%d", &tt);
int icase = ;
while(tt--) {
scanf("%d%u%u%u", &n, &x, &y, &z);
for(int i = ; i < n; i++) {
num[i] = tang();
}
ull mx = ;
if(n > ) {
int tmp = n - ;
nth_element(num, num + tmp, num + n);
for(int i = tmp; i < n; i++) {
for(int j = tmp; j < n; j++) {
ull tt = num[i] / gcd(num[i], num[j]) * num[j];
mx = mx > tt ? mx : tt;
}
}
} else {
for(int i = ; i < n; i++) {
for(int j = ; j < n; j++) {
ull tt = num[i] / gcd(num[i], num[j]) * num[j];
mx = mx > tt ? mx : tt;
}
}
}
printf("Case #%d: %llu\n", ++icase, mx);
}
return ;
}

第二题是2017年杭电多校的题目,Hints of sd0061(HDU6040:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6040

题目:

随机生成数组函数+nth-element函数

随机生成数组函数+nth-element函数

题意:用随机生成数组函数生成n个数,且求出第bi+1位的数,n的范围为1e7。

思路:这题照样需要借助nth_element函数,但是由于n太大,再加上要求m个数,复杂度妥妥地T,所以我们要想点优化,我们知道nth_element的复杂度是与所求范围来决定的,且nth_element函数会将大于某个数小于某个数分开,那么我们可以借助先求出排在后面的数,再求排在前面的数,逐步将范围缩小,从而缩小范围。

代码实现如下:

 #include <cstdio>
#include <algorithm>
using namespace std; const int maxn = 1e7 + ; int n, m;
pair<int, int> b[];
unsigned a[maxn], num[maxn];
unsigned x, y, z; unsigned rng61() {
unsigned t;
x ^= x << ;
x ^= x >> ;
x ^= x << ;
t = x;
x = y;
y = z;
z = t ^ x ^ y;
return z;
} int main() {
int icase = ;
while(~scanf("%d", &n)) {
scanf("%d%u%u%u", &m, &x, &y, &z);
for(int i = ; i < m; i++) {
scanf("%d", &b[i].first);
b[i].second = i;
}
sort(b, b + m);
b[m].first = n;
for(int i = ; i < n; i++) {
a[i] = rng61();
}
printf("Case #%d:", ++icase);
for(int i = m - ; i >= ; i--) {
nth_element(a, a + b[i].first, a + b[i+].first);
num[b[i].second] = a[b[i].first];
}
for(int i = ; i < m; i++) {
printf(" %u", num[i]);
}
printf("\n");
}
return ;
}

随机生成数组函数+nth-element函数的更多相关文章

  1. 学习笔记之Java队列Queue中offer&sol;add函数&comma;poll&sol;remove函数&comma;peek&sol;element函数的区别

    队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用. Java中Que ...

  2. PYTHON练习题 二&period; 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。

    Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...

  3. JavaScript---js语法&comma;数据类型及方法&comma; 数组及方法&comma;JSON对象及方法&comma;日期Date及方法&comma;正则及方法&comma;数据类型转换&comma;运算符&comma; 控制流程&lpar;三元运算&rpar;&comma;函数&lpar;匿名函数&comma;自调用函数&rpar;

    day46 一丶javascript介绍 JavaScript的基础分为三个       1.ECMAScript:JavaScript的语法标准.包括变量,表达式,运算符,函数,if语句,for语句 ...

  4. PHP函数积累总结(Math函数、字符串函数、数组函数)

    Math函数:10个较常用标红.abs — 绝对值acos — 反余弦acosh — 反双曲余弦asin — 反正弦asinh — 反双曲正弦atan2 — 两个参数的反正切atan — 反正切ata ...

  5. 算法初级面试题05——哈希函数&sol;表、生成多个哈希函数、哈希扩容、利用哈希分流找出大文件的重复内容、设计RandomPool结构、布隆过滤器、一致性哈希、并查集、岛问题

    今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀 ...

  6. 转&colon;在0~N&lpar;不包括N&rpar;范围内随机生成一个长度为M&lpar;M &lt&semi;&equals; N&rpar;且内容不重复的数组

    1. 最朴素暴力的做法. void cal1() { , j = , num = ; int result[M]; result[] = rand() % N; //第一个肯定不重复, 直接加进去 ; ...

  7. php数组函数(分类基本数组函数,栈函数,队列)

    php数组函数(分类基本数组函数,栈函数,队列函数) 一.总结 1.常用数组函数 函数 描述 array() 创建数组. array_combine() 通过合并两个数组来创建一个新数组. array ...

  8. javascript 数组的常用操作函数

    join() Array.join(/* optional */ separator) 将数组转换为字符串,可带一个参数 separator (分隔符,默认为“,”). 与之相反的一个方法是:Stri ...

  9. 精读JavaScript模式&lpar;四&rpar;,数组,对象与函数的几种创建方式

    一.前言 放了个元旦,休息了三天,加上春运抢票一系列事情的冲击,我感觉我的心已经飞了.确实应该收收心,之前计划的学习任务也严重脱节了:我恨不得打死我自己. 在上篇博客中,笔记记录到了关于构造函数方面的 ...

随机推荐

  1. jquery之hasClass

    看jquery的在线手册,hasClass的例子给的是这个 html部分: <div class="protected"></div><div> ...

  2. javascript中apply&lpar;&rpar;方法解析-简单易懂!

    今天看到了js的call与apply的异同,想着整理一下知识点,发现了一篇好文章,分享过来给大家,写的非常好! 参考: http://www.cnblogs.com/delin/archive/201 ...

  3. 关于oracle数据库(7)查询1

    查询所有列数据 select * from 表名; 查询指定列数据 效率高于查询所有列数据 select 列名,列名,列名 from 表名; --先执行from后面的代码,找到表,在执行select后 ...

  4. java常见文件操作

    收集整理的java常见文件操作,方便平时使用: //1.创建文件夹 //import java.io.*; File myFolderPath = new File(str1); try { if ( ...

  5. Python学习(二十八)—— Django模板系统

    转载自http://www.cnblogs.com/liwenzhou/p/7931828.html Django模板系统 官方文档 一.常用语法 只需要记两种特殊符号: {{  }}和 {% %} ...

  6. jQuery设置div的自适应布局

    一.HTML代码: <div class="ui-wraper" id="Wraper"> </div> 二.CSS代码: html { ...

  7. Python常见错误:IndexError&colon; list index out of range

    用python写脚本查询字典时,在遍历字典时循环到某一项时老是报错   出现这种错误有两种情况: 第1种可能情况 list[index]index超出范围 第2种可能情况 list是空值就会出现 In ...

  8. HDU 1576 A&sol;B&lpar;欧几里德算法延伸&rpar;

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目: Problem Description 要求(A/B)%9973,但由于A很大,我们只 ...

  9. maven 工程mybatis自动生成实体类

    generatorConfig.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ge ...

  10. Http&sol;2 升级指南

    [转]http://www.syyong.com/architecture/http2.html HTTP/2(最初名为HTTP/2.0)是 WWW 使用的 HTTP 网络协议的主要版本. 它来自早先 ...