首页 > 其他分享 >20240609训练

20240609训练

时间:2024-06-09 17:37:10浏览次数:17  
标签:p2 20240609 return 训练 int le p1 背包

商品打包(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;
}

标签:p2,20240609,return,训练,int,le,p1,背包
From: https://www.cnblogs.com/junjunccc/p/18239775

相关文章

  • 简单再谈谈java中的类和接口 20240609
    当我们谈论Java中的类和接口时,我们实际上是在讨论面向对象编程(Object-OrientedProgramming,OOP)的核心概念。OOP是一种编程范式,它将程序视为一组对象的集合,这些对象可以相互交互,通过消息传递来处理数据。让我们从头开始慢慢介绍。类(Class)在Java中,一个类是对象的蓝图或模板。它描......
  • PTA训练集阶段总结blog
    目录PTA训练集总结blog1.前言2.设计与分析题目集一7.4答题判题程序四关于设计要求:UML类图及设计分析:部分源码:复杂度分析:题目集五7.1家具强电电路模拟系统—1关于设计要求:UML类图及设计分析:部分源码:复杂度分析:题目集六家居强电电路模拟程序-2关于设计要求:UML类图及设计分析:部......
  • abc--cf训练日常总结
    ABC最近遇到好多思维和位运算的题目不会做,特地过来总结一些小小的知识点。思维题目https://atcoder.jp/contests/abc353/tasks/abc353_c这道题目要求我们计算连续的两个相邻的数组元素之和。我一开始用暴力,后面换了种错误的思路就wa了。其实这道题目是求和,然后找到和大于1e8......
  • 代码随想录算法训练营 day31 | 455.分发饼干 376.摆动序列 53.最大子数组和
    376.摆动序列说实话,没明白为啥算是贪心。最开始的思路是去重,然后统计正负变化次数。classSolution{public:intwiggleMaxLength(vector<int>&nums){if(nums.size()==1)return1;intans=0,last=-2,now;for(inti=1;i<nums.size();......
  • 【报错解决】深度学习模型训练时cuda内存足够但测试时反而报错cuda out of memory
    报错描述报错的代码如下:model=reader(config=args,encoder=encoder)#初始化模型model.to('cuda')#把模型放到gpu上model.load_state_dict(torch.load(join(args.checkpoint_path,'best_ckpt_model1.pkl')))#加载模型参数model=torch.nn.DataParallel(model)#并行化......
  • 代码随想录算法训练营第三十二天 | 122.买卖股票的最佳时机 55.跳跃游戏 45.跳跃游戏I
    122.买卖股票的最佳时机II题目链接文章讲解视频讲解思路:每次记录当天的股票价格,如果下一天比今天的价钱高那么今天就买,这样保证每一次买股票都是赚的否则记录下一天的股票,因为下一天的股票比今天的便宜,下一天买比今天买划算classSolution{public:intmaxProfit(v......
  • 实战 | YOLOv10 自定义数据集训练实现车牌检测 (数据集+训练+预测 保姆级教程)
    导读    本文主要介绍如何使用YOLOv10在自定义数据集训练实现车牌检测(数据集+训练+预测保姆级教程)。  YOLOv10简介  YOLOv10是清华大学研究人员在UltralyticsPython包的基础上,引入了一种新的实时目标检测方法,解决了YOLO以前版本在后处理和模型架构方面的不足......
  • 代码随想录算法训练营第四天 |
    24.两两交换链表中的节点题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。解题:关键:cur的位置在要交换的两个节点的前面具体如何交换的操作!!while种植条件:cur的下一个和下下个都不为空,不......
  • 代码随想录算法训练营第四天 Leetcode 24 两两交换链表节点 Leetcode19 删除链表倒数
    链表问题首先要记住设置虚拟头节点Leetcode24两两交换链表节点题目链接思路:就是简单模拟两两交换 要注意链表节点的处理一定要获取到合适的位置比如:这一题中两个交换节点的前一个节点注意链表保存临时节点/***Definitionforsingly-linkedlist.*publicclas......
  • 代码随想录算法训练营第五十一天| 121. 买卖股票的最佳时机、122.买卖股票的最佳时机I
    121.买卖股票的最佳时机一只股票只能买卖一次代码随想录.-力扣(LeetCode)输入:[7,1,5,3,6,4]输出:5解释:在第2天(股票价格=1)的时候买入,在第5天(股票价格=6)的时候卖出,最大利润=6-1=5。注意利润不能是7-1=6,因为卖出价格需要大于买入价格;同时,你不能在买入......