QZEZTEST2021.7.27分析
T1 qzez 错误检测
题意
思路
代码
T2 qzez 比赛
题意
题面
有\(AB\)两队,每队\(n\)人,两队间进行\(n\)场比赛,每个人都要参赛,对手随机且概率均等。每人都有一个实力值,若一场比赛中两队派出队员的能力值分别为\(A_i\)和\(B_j\),那么实力值高的一队能获得\((A_i-B_j)^2\)分。求所有情况中\(A\)队分值减\(B\)队分值的平均值(原题为“期望值”)。
输入格式
第一行一个数\(n\)表示两队的人数为\(n\)。
第二行\(n\)个数,第\(i\)个数\(A_i\)表示队伍\(A\)的第\(i\)个人的实力值。
第三行\(n\)个数,第\(i\)个数\(B_i\)表示队伍\(B\)的第\(i\)个人的实力值。
输出格式
输出仅包含一个实数表示\(A\)期望赢\(B\)多少分。答案保留到小数点后一位(注意精度)。
样例输入
2
3 7
1 5
样例输出
20.0
样例解释
有两种情况:
\(3-1,7-5\),此时\(A\)队赢\(8\)分。 \(3-5,7-1\),此时\(A\)队赢\(32\)分。 综上,平均值为\(20\)分。
思路
原题的“期望值”其实就是平均值,本题和概率论无关。
从样例中,我们不难发现,本题是要求\(\dfrac{ \sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} \pm(A_i-B_j)^2}{n}\)。展开完全平方公式,得到其实主要要求\(A_i^2+B_j^2-2A_iB_j\)。
分析对于每一个\(A_i\),要计算出\(\dfrac{\sum\limits_{j=1}^{n}{A_i^2+B_j^2-2A_iB_j}}{n}\),显然,把除以\(n\)放在最后输出的时候除会方便许多,那么式子就变成了\(\sum\limits_{j=1}^{n}{A_i^2+B_j^2-2A_iB_j}\),稍微变形一下就得到了\(n*A_i^2+\sum\limits_{j=1}^{n}B_j^2-2*A_i*\sum\limits_{j=1}^{n}{B_j}\)。显然,我们可以预处理出\(B\)的前缀和\(sp\)和前缀平方和\(pp\)(应该可以这么叫吧,即\(\sum\limits_{j=1}^{n}B_j^2\))。但是,我们还要注意到有\(\pm\)的存在。我们可以先对\(B\)排序(\(A\)无所谓),之后对于每个\(A_i\),二分(\(lower\)_\(bound\)即可)找到位置\(t\),使得\(A_i\ge B_t\)且\(A_i\le B_{t+1}\)即\(B_1\sim B_t\)\(A\)队赢,\(B_{t+1}\sim B_n\)\(A\)队输,即对于\(A_i\),我们的结果\(ans\)要加上\((t*A_i^2+\sum\limits_{j=1}^{t}{B_j^2}-2*A_i*\sum\limits_{j=1}^{t}{B_j})-((n-t)*A_i^2+\sum\limits_{j=t+1}^{n}{B_j^2}-2*A_i*\sum\limits_{j=t+1}^{n}{B_j})\),加上前缀和和前缀平方和得到最终结果:
\]
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 50005
#define ll long long
using namespace std;
ll n;
ll a[maxn],b[maxn];
ll sp[maxn],pp[maxn];
ll ansp,ansn,ans;
int main(){
scanf("%d",&n);
for(ll i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(ll i=1;i<=n;i++){
scanf("%d",&b[i]);
}
sort(a+1,a+1+n);
sort(b+1,b+1+n);
for(ll i=1;i<=n;i++){
sp[i]=sp[i-1]+b[i];
pp[i]=pp[i-1]+b[i]*b[i];
}
for(ll i=1;i<=n;i++){
ll t=lower_bound(b+1,b+1+n,a[i])-b-1;
ansp=a[i]*a[i]*t+pp[t]-2*a[i]*sp[t];
ansn=a[i]*a[i]*(n-t)+(pp[n]-pp[t])-2*a[i]*(sp[n]-sp[t]);
ans+=(ansp-ansn);
}
printf("%.1lf",(double)ans/n);
return 0;
}
T3 qzez Devoirs de maths
题意
思路
代码
T4 qzez 序列切割
题意
题面
有一长度为\(n\)的序列\(a\),要求分成\(k\)段,使得每段两端数字不互质,求最小的\(k\)值。
输入格式
第一行\(n\)
第二行空格隔开的\(n\)个数字,\(a_i\)表示第\(i\)个数字
输出格式
最少的切割个数\(k\)
样例输入
6
2 3 3 4 3 3
样例输出
2
样例解释
分成2 3 3 4$/$3 3两段,显然不唯一。
思路
显然此题为划分型\(DP\),我们设\(f_i\)为划分\(1\sim i\)可以得到的最小段数,由此可推出方程式\(f_i=\min\limits_{j=1,\gcd(i,j)>1}^{i}{f_j}+1\),就是说,把\(i,j\)划为一段,\(f_i\)等于\(f_j\)(即\(j\)之前的最佳方案)加\(i,j\)这一段(加一)。
暴力显然过不去,我们要考虑优化。发现每次寻找符合条件的所有\(j\)会浪费太多时间,所以我们注意到,只有有至少一个相同质因数的两个数才不互质,所以,对于每一个\(a_i\),我们只需要找到它的全部质因数,找到前面与它有至少一个相同质因数的数当作\(j\)就可以了。但是,这样找还是时间太长,我们不妨设\(g_i\)为有质因数\(i\)的数的最小\(f\)值,即对于所有有质因数\(i\)的数\(x\),\(g_i=min(f_x)\),这样,式子就变成了\(f_i=\min\limits_{j=prime_i}{g_j}+1\)(\(prime\)数组存全部除\(1\)以外的质因数)。
下面考虑\(g\)数组的更新,若现在的\(i\)自己成一段,\(g_{prime_i}=\min(g_{prime_i},f_{i-1})\),若\(i\)和其它一段,就不用更新了。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1000005
using namespace std;
int n;
int a[maxn];
int f[maxn],g[maxn];
int t=0,prime[maxn];
void findprime(int x){
t=0;
prime[++t]=x;
for(int i=2;i*i<=x;i++){
if(x%i==0){
prime[++t]=i;
prime[++t]=x/i;
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
memset(f,0x3f,sizeof(f));
memset(g,0x3f,sizeof(g));
f[0]=g[0]=0;
for(int i=1;i<=n;i++){
findprime(a[i]);
f[i]=f[i-1];
for(int j=1;j<=t;j++){
f[i]=min(f[i],g[prime[j]]);
}
f[i]++;
for(int j=1;j<=t;j++){
g[prime[j]]=min(g[prime[j]],f[i-1]);
}
}
printf("%d",f[n]);
return 0;
}
/*
6
2 3 3 4 3 3
*/
QZEZTEST2021.7.27分析的更多相关文章
- mysql-5.6.27源码安装及错误解决办法
wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.27.tar.gz yum install -y cmake 当然也可以自己下载源码包安 ...
- linux篇-linux mysql5.6.27源码安装和错误解决
centos mysql5.6.27 1编译安装 先进入到文件放置的路径下 创建一个个文件 #mkdir–p /data/mysql/mysql #mkdir–p /data/mysql/mysqld ...
- .net面试(汇总2)
c#继承: base 表示当前对象基类的实例(使用base关键字可以调用基类的成员)this表示当前类的实例 在静态方法中不可以使用base和this关键字 派生类会继承基类所有的成员但是构造函数和 ...
- 经典.net面试题目
1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保 ...
- net面试题
简述 private. protected. public. internal 修饰符的访问权限.答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成 ...
- .net面试题集锦
1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成 ...
- javascript运算符——位运算符
× 目录 [1]二进制 [2]非 [3]与[4]或[5]异或[6]左移[7]右移[8]>>>[9]应用 前面的话 位运算符是非常底层的运算,由于其很不直观,所以并不常用.但是,其速度 ...
- USACO3.1Humble Numbers[...]
题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包括,p1.p1*p2.p1*p1.p1*p2*p3. ...
- 经典.net试题
经典.net面试题目 1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. pr ...
随机推荐
- javax.naming.NoInitialContextException:Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
小弟初次用JNDI,使用数据源连接数据库,配置完相关的xml文件后,激动的我赶紧测试了一下,结果悲剧了,报出了错误: javax.naming.NoInitialContextException:Ne ...
- buu Youngter-drive
一.查壳,发现是upx的壳,用自解压方式,脱下壳 二.之后发现打不开了,应该是要修复,不想修复了,直接拖入ida 找到关键函数,中间发生一点小插曲,发现堆栈不平衡,然后导致F5反编译失败,百度了下是A ...
- 第16章 pyinstaller库的使用
pyinstaller库概述 将.py源代码,转换成无需源代码的可执行文件 .py文件通过pyinstaller转换成windows.linux以及mac的可执行文件 pyinstaller库是第三方 ...
- mongodb的基本命令与常规操作
1. 查看当前数据库的版本号:db.version()2. 查看当前所在数据库:db 默认是test数据库3. 查看当前数据库的连接地址:db.getMongo()4. 查看所有数据库:show da ...
- 深入理解Java容器——HashMap
目录 存储结构 初始化 put resize 树化 get 为什么equals和hashCode要同时重写? 为何HashMap的数组长度一定是2的次幂? 线程安全 参考 存储结构 JDK1.8前是数 ...
- 微软商业智能系列(一)初识微软BI
随着移动互联网.云计算.物联网和大数据技术的广泛应用,社会已经迈入全新的数据时代.掌握数据资产,进行智能化决策,已成为企业胜出的关键.越来越多的企业开始重视数据战略布局,重新定义自己的核心竞争力,从数 ...
- mongodb在双活(主备)机房的部署方案和切换方案设计
1. 概述 现在很多高可用系统为了应对极端情况,比如主机宕机.网络故障以及机房宕机等灾难的发生,通常会部署主备架构(双机房),或者双活架构(双机房),甚至多活架构(三个机房或者以上),mongodb天 ...
- SQLITE数据库不支持远程访问
SQLITE数据库不支持远程访问 import sqlite3 conn=sqlite3.connect("dailiaq.db") cur=conn.cursor() def c ...
- JAVA基础之JDK、JRE、JVM关系
什么是JRE和JDK JDK(Java Development Kit Java开发工具包) JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE.所以安装了JDK,就不 ...
- ESP8266 NodeMCU小白手把手入门(实操篇)以土壤湿度和DHT传感器为例讲解读取传感器的值
物联网使得现实世界中的实体和数字世界比以往任何时候都更紧密地联系在一起.NodeMCU作为其中的一个重要设备,作用之一就是与传感器相连以实现万物互联通讯.这篇关于NodeMCU的实操篇以土壤湿度传感器 ...