20240609训练

news/2025/1/19 3:35:43/文章来源:https://www.cnblogs.com/junjunccc/p/18239775

商品打包(pack)

题面:

\(n\)个商品,第\(i\)个商品的体积为\(a_i\),若干个质量为\(L\)的背包。令\(f_i\)为将第\(i\)个商品到第\(n\)个商品依次按如下的方式放入背包中所需要的最少背包数。

将第\(k\)商品放入背包的方法为,如果当前背包剩余容量\(\ge k\)那么放入,否则加入新背包。

题解:

从后往前加入,加入到第\(i\)个时所需要的背包数量即为\(f_i\)

正确性证明:

假设顺着走需要三个背包,倒着走需要两个(如图,其他情况同理):

pkNlqW4.md.png

其中令\(x_1\)\(x_2\)的和为\(a\),往后的每段同理依次为\(b\),\(c\),\(d\)。可以通过顺着和倒着写出两个方程组

顺着:

\[\left\{\begin{matrix}a\le L\\a+b>L\\b+c\le L\\b+c+d>L\\d\le L\end{matrix}\right. \]

倒着:

\[\left\{\begin{matrix}c+d\le L\\b+c+d>L\\a+b\le L\end{matrix}\right. \]

其中顺着和倒着中\(a+b\le L\)\(a+b>L\),矛盾,所以说不存在背包个数不一样的情况。

复杂度\(\Theta(n)\)

代码:

#include<cstdio>
const int N=200005;
int n,L,a[N],f[N];
int main(){freopen("pack.in","r",stdin),freopen("pack.out","w",stdout),scanf("%d%d",&n,&L);for(int i=1;i<=n;i++)scanf("%d",a+i);for(int i=n,cnt=1,sum=0;i;f[i]=cnt,i--){sum+=a[i];if(sum>L)sum=a[i],cnt++;}for(int i=1;i<=n;i++)printf("%d ",f[i]);return puts(""),fflush(stdout),fclose(stdin),fclose(stdout),0;
}

集合(set)

题面:

有一个正整数\(n\),和一个大小为\(m\)的可重集合\(B\),对任意的\(B\)的元素\(x\)其中可以令\(n\)变成\(\left\lfloor\frac n x\right\rfloor\)

\(n\)可以变成多少种数。

题解:

直接DFS即可,其中\(n\)可以变成的数的种类使用unordered_set存储

\(n=10^{15}\)\(B=\{2,3,5,7,11,13,17,19,23,29\}\)时,答案最大为\(458123\),可以使用unordered_set存储,时间可以通过。

代码:

#include<cstdio>
#include<unordered_set>
#include<algorithm>
typedef long long ll;
const int M=15;
ll n,a[M];
int m;
std::unordered_set<ll>vis;
inline bool cmp(ll x,ll y){return x>y;}
void dfs(ll x){if(vis.find(x)!=vis.end())return;vis.insert(x);if(x==0)return;for(int i=1;i<=m;i++)dfs(x/a[i]);
}
int main(){freopen("set.in","r",stdin),freopen("set.out","w",stdout),scanf("%lld%d",&n,&m);for(int i=1;i<=m;i++)scanf("%lld",a+i);return std::sort(a+1,a+m+1,cmp),m=std::unique(a+1,a+m+1)-a-1,dfs(n),printf("%lld\n",(ll)vis.size()),fflush(stdout),fclose(stdin),fclose(stdout),0;
}

最小生成树(mst)

暂时未完成

代码:

#include<cstdio>
#include<cstring>
#define int long long
const int N=300005,INF=0x3f3f3f3f3f3f3f3f;
int n,x[N],fa[N],size[N],in[N],to[N],res[N],pre[N],cpre[N],suf[N],csuf[N],ans;
bool vis[N];
int find(int x){return x^fa[x]?fa[x]=find(fa[x]):x;}
inline void swap(int&x,int&y){int t=x;x=y,y=t;
}
inline bool merge(int x,int y){x=find(x),y=find(y);if(x==y)return false;if(size[x]<size[y])swap(x,y);size[x]+=size[y],fa[y]=x;return true;
}
int calc(){memset(vis+1,0,sizeof(bool)*n);for(int i=1;i<=n;i++)vis[find(i)]=true;int cnt=0;for(int i=1;i<=n;i++)cnt+=(int)vis[i];return cnt;
}
inline bool Min(int&x,int y){if(x>y)return x=y,true;return false;
}
signed main(){freopen("mst.in","r",stdin),freopen("mst.out","w",stdout),scanf("%lld",&n);for(int i=1;i<=n;i++)scanf("%lld",x+i),fa[i]=i,size[i]=1;for(;calc()!=1;){for(int i=1,p1=0,p2=0;i<=n;pre[i]=p1,cpre[i]=p2,i++){in[i]=find(i),res[i]=INF;if(p1==0)p1=i;else if(p2==0){if(in[p1]!=in[i]){if(x[i]>x[p1])p2=p1,p1=i;else p2=i;}else{if(x[i]>x[p1])p1=i;}}else if(x[i]>x[p1]){if(in[i]==in[p1])p1=i;else p2=p1,p1=i;}else if(x[i]>x[p2]&&in[i]!=in[p1])p2=i;}for(int i=n,p1=0,p2=0;i;suf[i]=p1,csuf[i]=p2,i--){if(p1==0)p1=i;else if(p2==0){if(in[p1]!=in[i]){if(x[i]<x[p1])p2=p1,p1=i;else p2=i;}else{if(x[i]<x[p1])p1=i;}}else if(x[i]<x[p1]){if(in[i]==in[p1])p1=i;else p2=p1,p1=i;}else if(x[i]<x[p2]&&in[i]!=in[p1])p2=i;}for(int i=1;i<=n;i++){if(in[i]!=in[pre[i]]){if(Min(res[in[i]],x[i]-x[pre[i]]))to[in[i]]=in[pre[i]];}else if(cpre[i])if(Min(res[in[i]],x[i]-x[cpre[i]]))to[in[i]]=in[cpre[i]];if(in[i]!=in[suf[i]]){if(Min(res[in[i]],x[suf[i]]-x[i]))to[in[i]]=in[suf[i]];}else if(csuf[i])if(Min(res[in[i]],x[csuf[i]]-x[i]))to[in[i]]=in[csuf[i]];}for(int i=1;i<=n;i++)if(merge(in[i],in[to[i]]))ans+=res[in[i]];}printf("%lld\n",ans);return fflush(stdout),fclose(stdin),fclose(stdout),0;
}

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

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

相关文章

OOP大作业二轮总结

第二轮下来最大的体会是自己的代码相较之前精炼了很多,从第四次作业开始注重了遵循单一职责原则。在做需求分析这方面也花了更多心思以更好地面对之后的迭代。 关于OOP中的单一职责: 前一轮大作业我把用到的方法全部堆在了主函数里,一个主函数能有四五百行。这次学会了用“代…

6.9找回机制接口安全验证码token接口

响应包response burp截取拦截,改相应包; 思路:此处应该若是修改密码,先抓到修改成功数据包(截取验证关键字),在替换为需要绕过的数据包,截取response数据包,修改验证成功关键字达到绕过效果; 1.发送验证码 2.验证 3.重制密码 1-3跳过2; 短信轰炸 实例接口调用发包;…

运筹学练习Python精解——图与网络

练习1 北京(Pe)、东京(T)、纽约(N)、墨西哥(M)、伦敦(L)、巴黎(Pa)各城市之间的航线距离如下表所示。从北京(Pe)乘飞机到东京(T)、纽约(N)、墨西哥城(M)、伦敦(L)、巴黎(Pa)五城市做旅游,每城市恰去一次再返回北京,应如何安排旅游线,使旅程最短?L M N Pa Pe TL 0 56 35 2…

Win11系统下的MindSpore环境搭建

本文介绍了一个在Win11系统下,通过WSL2+Docker+VSCode的方案搭建了一个mindspore-gpu的编程环境。这种方案既可以实现Linux系统编程以及部署的便捷性,又可以兼顾Windows系统强大的办公软件生态,甚至还可以借助Docker达到一定的软件可迁移性和可复制性。技术背景 笔者尝试过不…

JSON文件存储

JSON 文件存储JSON,全称为 JavaScript Object Notation, 也就是 JavaScript 对象标记,通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。对象和数组在 JavaScript 语言中,一切皆为对象。因此任何支持的类型都可以通过 JSON 来表…

关于类、继承、接口的复习(1)

均使用这个层次结构:多态:一个对象变量可以指示多种实际类型 动态绑定:一个对象变量在运行时能够自动选择适合的方法 注:对象变量是一种“引用”,引用不同块对象的内存,“指示多种实际类型”就是一个对象变量可以在不同情况下引用了多种有继承关系的类型,规则是——对象…

OO题目集4~6总结

OO题目集4~6总结 ​ 在之后的几次题目集的7-1题目中,难度渐渐高了起来,第四次题目集主要是在第三次题目集的基础上添加了一些功能,而之后的两次则是设计一个新的程序,是关于电路设备及电路的,与之前的答题程序不同,新的题目对于创新和思考能力以及思维逻辑能力要求更…

南昌航空大学软件学院-23201930-刘靖辉-第二次blog作业

1. 前言 2. 设计与分析2.1 OOP-4:答题判题程序12.1.1 题目2.1.2 源码2.1.3 评价与分析2.1.4 踩坑心得2.1.5 改进建议2.2 OOP-5:答题判题程序22.2.1 题目2.2.2 源码2.2.3 评价与分析2.2.4 踩坑心得2.2.5 改进建议2.3 OOP-6:答题判题程序32.3.1 题目2.3.2 源码2.3.3 评价与分析…

跟思兼学Klipper(30):使用辅助宏调整3D打印机无感归位堵转检测阈值

又名《调整堵转检测阈值降低创想三维 K1C 打印机无感归位啪啪声》 前言 原创文章,转载引用务必著名链接,水平有限,如有疏漏,欢迎指正交流。 文章如有更新请访问 DFRobot 社区及 cnblogs 博客园,前者内容较全,后者排版及阅读体验更佳。 手中的创想三维 K1C 3D 打印机目前使…