NOIP2021比赛题解

报数

1.禁止报的数的生成规则与埃氏筛法类似,考虑用筛法预处理可以报出的数字列表和不可报出的数字,从而 O(1) 回答每一组询问。

具体来说,从 1 开始逐一处理每个正整数。当处理到数字 x 时,如果数字 x 尚未被标记为不合法,就通过拆位判断它是否合法。如果是合法数字,则将其加入合法数字列表,否则将 x 的所有倍数(包括 x 本身)全部标记为不合法数字;如果数字 x 已经被标记为不合法,则因为数字 x 的所有倍数都已经在之前和数字 x 一同被标为不合法数字,不需要再执行额外操作。

2.The end...

#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
int t,la,nx[N];
bool f[N];
bool check(int x){while(x!=0){if(x%10==7) return 1;x/=10;}return 0;
}
void pre(){for(int i=1;i<=N;i++){if(f[i]) continue;if(check(i)){for(int j=1;i*j<=N;j++){f[i*j]=1;}continue;}nx[la]=i;la=i;}return;
}
int main(){scanf("%d",&t);pre();while(t--){int x;scanf("%d",&x);if(f[x]) printf("-1\n");else printf("%d\n",nx[x]);}return 0;
}

数列

1.可以想到dp。可以发现,S 的二进制表示位中 1 的数量会涉及进位的问题。由于进位是从低位向高位进行的,所以考虑在 S 中从低位到高位按位 dp(最低位为第 0 位)。

2.设计 dp 状态 f(i,j,k,p) 表示:讨论了 S 从低到高的前 i 位,已经确定了 j 个序列 a 中的元素,S 从低到高前 i 位中有 k 个 1,要向当前讨论位的下一位进位 p。因为从上一个状态转移到 f(i,j,k,p) 细节太多,所以考虑用 f(i,j,k,p) 往后转移。接下来讨论第 i 位(位从 0 开始编号)。假设序列 a 中有 t 个元素为 i,那么就相当于给 S 的第 i 位贡献了 t 个 1,再加上上一位进过来的 p 个 1,总共有 t+p 个 1。可以知道,当前位每两个 1 可以向下一位进 1。所以 (t+p)%2 的结果即为全部进位后当前位是否为 1。同理,向下一位进的 1 的个数即为 ⌊t+p2⌋/2。

f(i,j,k,p) 往后转移的状态为f(i+1,j+t,k+(t+p)%2,⌊2t+p​⌋/2)

统计答案呢:对于 i 这一维,由于 a 中元素的范围是 0∼m,所以 S 只用看总共 m+1 位,所以是 m+1。对于 j 这一维,最终 n 个元素都要确定,所以是 n。对于 k 这一维,应该是在 0∼k 之间的。(p 这一维就随便了)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
ll ans,v[105],dp[105][35][35][16],pv[105][35];
ll C[35][35];
inline void init(int n){for(int i=0;i<=n;i++) C[i][0]=1;for(int i=1;i<=n;i++)for(int j=1;j<=i;j++) C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
inline int popcnt(int n){int res=0;while(n) res+=n&1,n>>=1;return res;
}
int main(){init(30);int n,m,K;scanf("%d%d%d",&n,&m,&K);for(int i=0;i<=m;i++){scanf("%lld",&v[i]);pv[i][0]=1;for(int j=1;j<=n;j++) pv[i][j]=pv[i][j-1]*v[i]%mod;}dp[0][0][0][0]=1;for(int i=0;i<=m;i++)for(int j=0;j<=n;j++)for(int k=0;k<=K;k++)for(int p=0;p<=n>>1;p++)for(int t=0;t<=n-j;t++) dp[i+1][j+t][k+(t+p&1)][t+p>>1]=(dp[i+1][j+t][k+(t+p&1)][t+p>>1]+dp[i][j][k][p]*pv[i][t]%mod*C[n-j][t]%mod)%mod;for(int k=0;k<=K;k++)for(int p=0;p<=n>>1;p++)if(k+popcnt(p)<=K) ans=(ans+dp[m+1][n][k][p])%mod;printf("%lld",ans);return 0;
}

方差

1.直接爆搜(然后对了3个点,剩下的全wa了,明显思路不对(其实是乱搞))得了12分

#include<bits/stdc++.h>
#define int long long
const int base=133,base2=131;
const int mod=10000019,mod2=998244353;
const int maxn=1e4+5;
using namespace std;
unordered_map<int,int>mp,mp2;
vector<int>now;
int a[maxn],b[maxn];
int n,ans=1e18;
int lst[maxn],vis[maxn];
int hash1(){int anss=0;for(int i=1;i<=n;i++){anss=(anss+b[i]*base%mod)%mod;}return anss;
}
int hash2(){int anss=0;for(int i=1;i<=n;i++){anss=(anss+b[i]*base2%mod2)%mod2;}return anss;
}
void check(){for(int i=1;i<=n;i++) b[i]=a[i];for(int i=0;i<now.size();i++){b[now[i]]=b[now[i]-1]+b[now[i]+1]-b[now[i]];}int now=0;	for(int i=1;i<=n;i++){now+=b[i];}int noww=0;for(int i=1;i<=n;i++){noww=noww+(n*b[i]-now)*(n*b[i]-now);}noww/=n;ans=min(ans,noww);
}
void dfs(int x){int noww=hash1();int nowww=hash2();if(mp[noww]&&mp2[nowww]) return;mp[noww]=1;mp2[nowww]=1;for(int i=2;i<n;i++){now.push_back(i);check();dfs(x+1);now.pop_back();}
}
signed main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];b[i]=a[i];}	check();dfs(1);cout<<ans;return 0;
}

2.考虑暴力: 显然可以转为交换差分数组相邻两项。而一个直观的结论是差分数组单谷。考虑搜索差分数组中每种取值中分别有多少在谷两侧。这个做法的时间上限应为 maxp​∏(pi​+1),其中 pi​ 为差分数组中值为 i 的元素数。显然,p 是 n−1 的一个划分且大小小于 min⁡(n,o(max⁡ai));易得 pp 中必存在一元素至少为 n−1−maxai​。(能得60分)

#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {int x = 0, f = 1;char ch = getchar();while(!isdigit(ch)) {if(ch == '-') f = -1;ch = getchar();}while(isdigit(ch)) {x = x * 10 + ch - '0';ch = getchar();}return x * f;
}
const int N = 1e4 + 100;
int n, ans = 1e18, a[N], d[N];
inline int calc() {for(int i = 1; i <= n; ++i) a[i] = a[i - 1] + d[i];int R, s1 = 0, s2 = 0;for(int i = 1; i <= n; ++i)s1 += a[i] * a[i], s2 += a[i];R = n * s1 - s2 * s2;return R;
}
signed main() {srand(time(0));n = read();for(int i = 1; i <= n; ++i) a[i] = read(), d[i] = a[i] - a[i - 1];int T = 100;while(T--) {random_shuffle(d + 2, d + 1 + n);int t = 0;int res = 1e18;while(t < 300) {int x = rand() % n + 1, y = rand() % n + 1;if(x == 1 || y == 1) continue;if(x != y) {swap(d[x], d[y]);int tmp = calc();if(tmp < res) {t = 0;res = tmp;} else ++t, swap(d[x], d[y]);} }ans = min(ans, res);}cout << ans << '\n';return 0;
}

3.考虑正解:可以发现:每次操作就是交换差分,那么相当于差分可以随便重排。化一下这个方差的式子,就是 n×∑ai^2−(∑ai)^2。然后 a 同时减小某个数对答案是没有影响的,那么可以钦定 a1​=0。尝试去猜结论,发现样例的差分是2 1 2,可以猜测到这个差分是先减小后递增的,(具体的证明不会,感性理解这样数就会尽可能的“均匀”)。

然后就容易想到做法了:先把差分重排,从小到大考虑,那么每个差分要么插在首要么插在尾,但是两个相减的东西很难维护,那么可以想当把一维放到状态里去,经过一些尝试后发现就是 ∑ai​,即 dpi,j​ 表示处理到前 i 个差分,这 i 个差分还原出来的 ai​ 序列的和是 j,在这个情况下的 ∑ai^2​ 的最小值,然后你发现无论是插头上还是尾巴上都是可以快速算出新的 ∑ai​ 和 ∑ai^2​ 的。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF=1e18,mod=1e9+7;
const int N=10010;
int a[N],d[N];
ll f[2][500010];
int main(){int n;scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);int m=n-1;for(int i=1;i<=m;i++){d[i]=a[i+1]-a[i];}sort(d+1,d+m+1);int s=0;for(int i=1;i<=n;i++) s+=d[i]*i;int now=0,u=0;for(int j=0;j<=s;j++) f[u][j]=INF;f[0][0]=0;for(int i=1;i<=m;i++){if(d[i]==0) continue;u^=1;now+=d[i];for(int j=0;j<=s;j++){f[u][j]=INF;int k=j-i*d[i];if(k>=0) f[u][j]=min(f[u][j],f[u^1][k]+(ll)i*d[i]*d[i]+(ll)2*k*d[i]);k=j-now;if(k>=0) f[u][j]=min(f[u][j],f[u^1][k]+now*now);}}ll ans=INF;for(int j=0;j<=s;j++){if(f[u][j]<INF)ans=min(ans,n*f[u][j]-(ll)j*j);}cout<<ans<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/59997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘云计算 | 2、业务需求推动IT发展

揭秘云计算 | 1、云从哪里来&#xff1f;-CSDN博客https://blog.csdn.net/Ultipa/article/details/143430941?spm1001.2014.3001.5502 书接上文&#xff1a; 过去几十年间IT行业从大型主机过渡到客户端/服务器&#xff0c;再过渡到现如今的万物互联&#xff0c;IT可把控的资…

Grover算法——量子搜索算法

假设N个数据中符合条件的数据有M个&#xff0c;则量子搜索算法的复杂度为&#xff0c;远小于经典算法的复杂度。 黑箱 下面以N2为例&#xff0c;介绍黑箱如何标记符合条件的数据。N2意味着只有两个数据&#xff0c;可以用0和1来表示这两个数据&#xff0c;也就只需要一个量子比…

Ubuntu24.04网络异常与应对方案记录

PS: 参加过408改卷的ZJU ghsongzju.edu.cn 开启嘲讽: 你们知道408有多简单吗&#xff0c;操作系统真实水平自己知道就行&#xff5e;&#xff5e; Requested credits of master in UWSC30&#xff0c;in ZJU24&#xff0c;domestic master is too simple ubuntu安全软件 在 U…

智能的编织:C++中auto的编织艺术

在C的世界里&#xff0c;auto这个关键字就像是一个聪明的助手&#xff0c;它能够自动帮你识别变量的类型&#xff0c;让你的代码更加简洁和清晰。下面&#xff0c;我们就来聊聊auto这个关键字的前世今生&#xff0c;以及它在C11标准中的新用法。 auto的前世 在C11之前&#x…

Spark的Standalone集群环境安装

一.简介 与MR对比&#xff1a; 概念MRYARNSpark Standalone主节点ResourceManagerMaster从节点NodeManagerWorker计算进程MapTask&#xff0c;ReduceTaskExecutor 架构&#xff1a;普通分布式主从架构 主&#xff1a;Master&#xff1a;管理节点&#xff1a;管理从节点、接…

cache(一)基本概念

在知乎发现一份不错得学习资料 请教CPU的cache中关于line,block,index等的理解&#xff1f; PPT 地址 https%3A//cs.slu.edu/%7Efritts/CSCI224_S15/schedule/chap6-cache-memory.pptx 课程主页 https://cs.slu.edu/~fritts/CSCI224_S15/schedule/ 文章目录 1. cache概念2. cac…

前端CSS3 渐变详解

文章目录 CSS3 渐变详解一、引言二、CSS3 渐变基础1、线性渐变1.1、基本线性渐变1.2、改变渐变方向 2、径向渐变2.1、基本径向渐变2.2、设置径向渐变的中心 三、高级渐变技巧1、重复渐变1.1、重复线性渐变1.2、重复径向渐变 四、总结 CSS3 渐变详解 一、引言 在现代网页设计中…

ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver(二)

ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver&#xff08;二&#xff09; 本教程作为gdb/gdbserver编译安装教程的一个补充&#xff0c;教会大家如何使用gdb/gdbserver进行远程调试。 如上图所示&#xff0c;我们需要将编译后的gdbserver上传至目标设备&#xff0c;其上…

(65)使用RLS自适应滤波器进行信道均衡的MATLAB仿真

文章目录 前言一、仿真说明二、码间串扰、色散、与频率选择性衰落1. 码间串扰&#xff08;ISI&#xff09;2. 信道的色散与码间串扰3. 减少ISI的方法 三、MATLAB仿真代码四、仿真结果1.发送16QAM信号的星座图2.信道的频率响应3.接收16QAM信号的星座图4.均衡后16QAM信号的星座图…

【数据分析】如何构建指标体系?

有哪些指标体系搭建模型&#xff1f;五个步骤教你从0开始搭建指标体系 一、企业指标体系搭建存在什么问题 许多企业在搭建数据指标体系时遇到了诸多难题&#xff0c;如问题定位不准确、数据采集不完整、目标不一致、报表无序、指标覆盖不全面以及报表价值未充分利用等。 1、…

【Linux 30】传输层协议 - TCP

文章目录 &#x1f308; 一、TCP 协议介绍⭐ 1. TCP 协议的特点 &#x1f308; 二、TCP 协议格式⭐ 1. TCP 报头中各字段的含义⭐ 2. 各 TCP 标志位的用途⭐ 3. 使用结构体描述 TCP 报头 &#x1f308; 三、TCP 的窗口⭐ 1. TCP 的发送和接收缓冲区⭐ 2. TCP 为什么存在缓冲区⭐…

【Linux杂货铺】IO多路复用

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 五种IO模型 &#x1f4c2; 阻塞IO &#x1f4c2; 非阻塞IO &#x1f4c2; 信号驱动IO &#x1f4c2; 多路复用 &#x1f4c2; 异步IO &#x1f4c1; 非阻塞IO实现 &#x1f4c1; select &#x1f4c2; 接口使用 &#x…

Kafka 的一些问题,夺命15连问

kafka-中的组成员 kafka四大核心 生产者API 允许应用程序发布记录流至一个或者多个kafka的主题&#xff08;topics&#xff09;。 消费者API 允许应用程序订阅一个或者多个主题&#xff0c;并处理这些主题接收到的记录流 StreamsAPI 允许应用程序充当流处理器&#xff08;s…

ANNOVAR下载

1.官网 https://annovar.openbioinformatics.org/en/latest/user-guide/startup/ 都填英文 要不然会报错 tar -xzvf annovar.latest.tar.gztree . ├── annotate_variation.pl ├── coding_change.pl ├── convert2annovar.pl ├── example │ ├── ex1.avinput…

集群架构中Lua脚本的限制以及出现的报错

&#x1f680; 博主介绍&#xff1a;大家好&#xff0c;我是无休居士&#xff01;一枚任职于一线Top3互联网大厂的Java开发工程师&#xff01; &#x1f680; &#x1f31f; 在这里&#xff0c;你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人&#xff0c;我不仅热衷…

大语言模型:解锁自然语言处理的无限可能

0.引言 在当今的科技时代&#xff0c;自然语言处理技术正以前所未有的速度发展&#xff0c;语言大模型作为其中的核心力量&#xff0c;对各个领域产生了深远的影响。本文旨在探讨语言大模型的发展历程、核心技术以及广泛的应用场景&#xff0c;以帮助读者更好地理解这一前沿技…

MATLAB实现智能水滴算法(Intelligent Water Drops Algorithm, IWDA)

1.智能水滴算法介绍 智能水滴算法&#xff08;Intelligent Water Drops Algorithm&#xff0c;IWDA&#xff09;是一种基于水滴特性的智能优化算法&#xff0c;它借鉴了水滴在自然界中的运动和形态变化规律&#xff0c;通过模拟水滴的形成、发展和消亡过程&#xff0c;实现问题…

【计网】基于TCP协议的Echo Server程序实现与多版本测试

目录 前言&#xff1a; 1、InitServer类的实现 1.1. 创建流式套接字 1.2. bind 绑定一个固定的网络地址和端口号 1.3.listen监听机制 1.4.完整代码 2. 循环接收接口与服务接口 2.1.accept函数讲解 讲个商场拉客的故事方便我们理解&#xff1a; 2.2.服务接口实现 3.服…

easyexcel实现自定义的策略类, 最后追加错误提示列, 自适应列宽,自动合并重复单元格, 美化表头

easyexcel实现自定义的策略类, 最后追加错误提示列, 自适应列宽,自动合并重复单元格, 美化表头 原版表头和表体字体美化自动拼接错误提示列自适应宽度自动合并单元格使用Easyexcel使用poi导出 在后台管理开发的工作中,离不开的就是导出excel了. 如果是简单的导出, 直接easyexce…

边缘计算的学习

文章目录 概要何为边缘计算&#xff1f;现阶段&#xff0c;企业使用边缘计算相对云计算 整体架构流程边缘网络组件边缘计算与云安全 研究方向结合引用 概要 edge 何为边缘计算&#xff1f; 边缘计算&#xff08;英语&#xff1a;Edge computing&#xff09;&#xff0c;是一种…