随机生成数组函数+nth-element函数
这几天做了几道随机生成数组的题,且需要用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
题目:
题意:用随机生成数组函数生成n个数,求这n个数中两两的lcm(最小公倍数)的最大值,n的范围为2e6.
思路:虽说要n个,但是我们只需要取出100个最大的即可,因为据证明两个数互质的概率为(具体证明请自行百度),所以我们只需将这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
题目:
题意:用随机生成数组函数生成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函数的更多相关文章
- 学习笔记之Java队列Queue中offer/add函数,poll/remove函数,peek/element函数的区别
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用. Java中Que ...
- PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。
Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...
- JavaScript---js语法,数据类型及方法, 数组及方法,JSON对象及方法,日期Date及方法,正则及方法,数据类型转换,运算符, 控制流程(三元运算),函数(匿名函数,自调用函数)
day46 一丶javascript介绍 JavaScript的基础分为三个 1.ECMAScript:JavaScript的语法标准.包括变量,表达式,运算符,函数,if语句,for语句 ...
- PHP函数积累总结(Math函数、字符串函数、数组函数)
Math函数:10个较常用标红.abs — 绝对值acos — 反余弦acosh — 反双曲余弦asin — 反正弦asinh — 反双曲正弦atan2 — 两个参数的反正切atan — 反正切ata ...
- 算法初级面试题05——哈希函数/表、生成多个哈希函数、哈希扩容、利用哈希分流找出大文件的重复内容、设计RandomPool结构、布隆过滤器、一致性哈希、并查集、岛问题
今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀 ...
- 转:在0~N(不包括N)范围内随机生成一个长度为M(M <= N)且内容不重复的数组
1. 最朴素暴力的做法. void cal1() { , j = , num = ; int result[M]; result[] = rand() % N; //第一个肯定不重复, 直接加进去 ; ...
- php数组函数(分类基本数组函数,栈函数,队列)
php数组函数(分类基本数组函数,栈函数,队列函数) 一.总结 1.常用数组函数 函数 描述 array() 创建数组. array_combine() 通过合并两个数组来创建一个新数组. array ...
- javascript 数组的常用操作函数
join() Array.join(/* optional */ separator) 将数组转换为字符串,可带一个参数 separator (分隔符,默认为“,”). 与之相反的一个方法是:Stri ...
- 精读JavaScript模式(四),数组,对象与函数的几种创建方式
一.前言 放了个元旦,休息了三天,加上春运抢票一系列事情的冲击,我感觉我的心已经飞了.确实应该收收心,之前计划的学习任务也严重脱节了:我恨不得打死我自己. 在上篇博客中,笔记记录到了关于构造函数方面的 ...
随机推荐
- 《剑指offer》---跳台阶问题
本文算法使用python3实现 1. 问题1 1.1 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 时间限制:1s:空间限制:3276 ...
- JS 书籍拓展内容
一.面向对象
- 【Linux】CentOS安装redis
CENTOS7下安装REDIS 安装完成之后使用:redis-cli命令连接,如图: 提示:/var/run/redis_6379.pid exists, process is already run ...
- Bootstrap 导航条理解
以下理论内容copy自Bootstrap中文网 (一个不错的bootstrap学习网站) 导航条 默认样式的导航条 导航条是在您的应用或网站中作为导航页头的响应式基础组件.它们在移动设备上可以折叠(并 ...
- Oracle触发器实现监控某表的CRUD操作
前提:请用sys用户dba权限登录 1.创建一个表来存储操作日志 create table trig_sql( LT DATE not null primary key, SID NUMBER, SE ...
- C++基础知识(二)
八. 继承:让某个类的对象获得另一个类的对象的特性.通过继承可实现代码重用,即从已存在的类派生出的一个新类将自动具有原来那个类的特性. 类的继承还具有:(1)单向性:A类为B类的基类(父类),则派生类 ...
- BZOJ 1509 逃学的小孩(树的直径)
题意:从树上任找三点u,v,w.使得dis(u,v)+min(dis(u,w),dis(v,w))最大. 有一个结论u,v必是树上直径的两端点. 剩下的枚举w就行了. 具体不会证... # inclu ...
- Javascript 中 == 和 === 区别是什么?
Javascript 中 == 和 === 区别是什么? 作者:Belleve链接:https://www.zhihu.com/question/31442029/answer/77772323来源: ...
- CentOS scp远程拷贝
scp(secure copy)是一个基于 SSH 协议在网络之间进行安全传输的命令, 其格式为“scp [参数] 本地文件 远程帐户@远程 IP 地址:远程目录”. 1.主要参数 -v 显示详细的连 ...
- 【SPOJ】Highways(矩阵树定理)
[SPOJ]Highways(矩阵树定理) 题面 Vjudge 洛谷 题解 矩阵树定理模板题 无向图的矩阵树定理: 对于一条边\((u,v)\),给邻接矩阵上\(G[u][v],G[v][u]\)加一 ...