首页 > 其他分享 >随机序列

随机序列

时间:2023-07-13 20:36:09浏览次数:21  
标签:10 vert int kmax 随机 数组 序列 include

Problem

给出两个长度均为 \(n\) 的数组 \(a\) 和 \(b\),其中 \(a_i\) 中有一些位置是 。你需要将 \(a\) 中若干个 \(0\) 修改成其他的数,要求最终的数组 a 满足:

  1. \(\{a_i\}\{b_i\}\) 中,所有数都是 \([0,x]\) 之间的整数;

  2. 所有正整数在 \(\{a_i\}\) 和 \(\{b_i\}\) 中的出现次数加起来不超过 \(1\);

在此基础上,设 \(p\) 为 “随机两个 \([1,n]\) 之间的整数 \(i, j\)” 后,“\(a_i > b_j\)” 这一事件发生的概率,要求选择一种修改 \(\{a_i\}\) 的方式,使得 \(\vert p - 0.5 \vert\) 最小。

要求返回使得 \(\vert p - 0.5 \vert\) 最小的 \(p\)。如果存在多个 \(p\),输出较小的那个。

\(n \le 50, x \le 10^9\)

Input

第一行一个正整数 \(n\),代表序列的长度。

第二行个整数,代表数组 \(a\)。

第三行个整数,代表数组 \(b\)。

第四行一个正整数,代表 \(x\)。

Output

输出仅一行,一个小数 \(p\)。

精度误差在 \(10^{-6}\) 以内。

Sample

Input 1

4
0 2 7 0
6 3 8 10
12

Output 1

0.4375

Solution

由于 \(a\) 中每一个元素会对 \(b\) 中元素进行比较,所以改变 \(b\) 中元素的顺序不影响答案。将 \(b\) 数组排序,这样可以快速地知道对于 \(a\) 中每一个非 \(0\) 元素,\(b\) 中有多少元素大于它。

同时,\(b\) 数组也将区间 \([0,x]\) 分成若干个连续的段,每段中的数对答案的贡献是相同的。此时原问题转化成了一个多重背包问题,每种物品有相应的贡献和数量,最终计算概率求出 \(p\) 值。

可以采用二进制优化,但我选择使用 \(bitset\) 来减小空间。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<bitset>
#include<iomanip>

using namespace std;

const int kmax = 55;

int n, k, a[kmax], b[kmax];
int w[kmax], c;
int res = -1e9;
bitset<kmax * kmax> f[kmax];

int main() {
	cin >> n;
	for(int i = 1; i <= n; i++) {
		cin >> a[i];
		k += !a[i]; // 计算有多少个0
	}
	for(int i = 1; i <= n + 1; i++) {
		cin >> b[i];
	}
	b[n + 1]++; // 右闭区间转开区间
	sort(b + 1, b + n + 1); // 排序
	for(int i = 1; i <= n; i++) {
		w[i] = min(b[i + 1], b[n + 1]) - b[i] - 1; // 求区间
		for(int j = 1; j <= n; j++) {
			if(a[j] > b[i]) c++; // 计算原先有多少对
			if(b[i] < a[j] && a[j] < b[i + 1]) w[i]--; // a中原先的数不能选
		}
	}
	for(int i = 0; i <= k; i++) {
		f[i][c] = 1; // 初始化
	}
	for(int i = 1; i <= n; i++) { // 多重背包
		for(int j = 1; j <= w[i] && j <= k; j++) {
			for(int l = k - 1; l >= 0; l--) {
				f[l + 1] |= f[l] << i; // bitset 转移
			}
		}
	}
	for(int i = 0; i <= n * n; i++) {
		if(!f[k][i]) continue; // 该状态无法实现
		if(abs(n * n - 2 * res) <= abs(n * n - 2 * i)) continue; // 不够优
		res = i;
	}
	cout << fixed << setprecision(9) << 1.0 * res / n / n << '\n';
	return 0;
}

标签:10,vert,int,kmax,随机,数组,序列,include
From: https://www.cnblogs.com/ereoth/p/17552047.html

相关文章

  • 最大子序列求和
    一.O(n^3)列举起点与终点然后求每个子序列的和for(inti=0;i<n;i++)cin>>a[i];intleft,right;for(inti=0;i<n;i++){for(intj=i;j<n;j++){longlongsum=0;for(intk=i,k<=j;k++){sum+=a[k];}if(sum>maxx){......
  • jboss JMXInvokerServlet反序列化漏洞
    jmxinvokerservlet反序列化漏洞描述:JBOSS在/invoker/jmxinvokerservlet请求中读取了用户传入的对象,可利用apachecommonscollections中的gadget执行任意代码CommonCollectionGadget主要是由ConstantTransformer,InvokerTransformer,ChainedTransformer构成。gadget主要通过Transfor......
  • 在Unity3D中使用ScriptableObject进行序列化
    ScriptableObject类型经常用于存储一些unity3d本身不可以打包的一些object,比如字符串,一些类对象等。用这个类型的子类型,则可以用BuildPipeline打包成assetbundle包供后续使用,非常方便。这样除了playerpref和c#文件读取外,另外的一种存取一些数据对象的方法1.usingUnityEngine;......
  • m完整的SC-FDE单载波频域均衡通信链路matlab仿真,包括UW序列,QPSK,定时同步,载波同步,
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要        完整的SC-FDE单载波频域均衡通信链路的设计和实现,包括UW序列的设计、QPSK调制、帧同步、定时同步、载波同步、SNR估计和MMSE信道估计等环节。本文首先介绍了SC-FDE通信系统的基本......
  • 在集合中加入随机的数字(1-20)
    publicvoidnums(){ArrayListlist=newArrayList();Randomr=newRandom();list.Add(r.Next(20));while(true){if(list.Count==20)break;intnum=r.N......
  • 3.3_转换与处理时间序列数据
    pandas时间相关的类类名称说明Timestamp最基础的时间类。表示某个时间点。在绝大多数的场景中时间数据都是以Timestamp形式的时间Period表示单个时间跨度,或者某个时间段,例如某一天,某一小时等。Timedelta表示不同单位的时间,例如1天,1.5小时,3分钟,4秒等,而非具体的......
  • Java反序列化:URLDNS的反序列化调试分析
    URLDNS链子是Java反序列化分析的第0课,网上也有很多优质的分析文章。笔者作为Java安全初学者,也从0到1调试了一遍,现在给出调试笔记。一.Java反序列化前置知识Java原生链序列化:利用Java.io.ObjectInputStream对象输出流的writerObject方法实现Serializable接口,将对象转化成字节......
  • 如何实现redis 缓存数据的过期时间设置随机化的具体操作步骤
    Redis缓存数据的过期时间设置随机化在大型应用程序中,缓存是提高性能和减少数据库负载的重要技术。Redis是一种流行的内存缓存数据库,能够快速地存储和检索数据。在使用Redis缓存数据时,设置缓存数据的过期时间是很常见的需求。为什么要设置缓存数据的过期时间缓存数据的过期时......
  • 解决redis hash序列化报错的具体操作步骤
    RedisHash序列化报错的解决方法1.问题背景在使用Redis时,有时候会遇到Hash序列化报错的问题。这种问题通常是由于Redis中存储的数据类型与操作的数据类型不一致导致的。在下面的文章中,我将为你详细介绍解决这个问题的步骤和相应的代码示例。2.解决步骤步骤操作1.查......
  • 怎么让java从键盘随机输入 来解决一个具体问题的方案
    怎么让Java从键盘随机输入在Java中,我们可以使用Scanner类从键盘获取用户的输入。通过使用Scanner类,我们可以实现从键盘随机输入不同类型的数据,例如整数、浮点数、字符串等。以下是一个示例代码,展示了如何在Java中使用Scanner类从键盘随机输入整数、浮点数和字符串:importjava.ut......