【题解】 CF730J Bottles

CodeForces - 730J (2020.5.14训练J题) Problem Nick has n bottles of soda left after his birthday. Each bottle is described by two values: remaining amount of soda a i and bottle volume bi( ai ≤ bi). Nick has decided to pour all remaining soda into minimal number of bottles, moreover he has to 阅读详情

这道题的思路其实就是转化题意+01背包。

首先 k 应该是最好想的,随便乱搞都能求出来(自己想一想,肯定能想出来)。这里就提醒一句:按照容积从大到小排个序,之后暴力往前倒水就行了。

其次,倒来倒去,t 实际上就是移动了的部分的总体积和,t 最小就意味着没有移动的部分体积最大。那么 t 就完全可以用01背包求出来了。dp[i][j] 表示当前选了 i 个瓶子,总容积为 j 时的最小总体积和。那么用01背包的思路去想,把每一个 b[i] 当做价值,把每一个 a[i] 当做花费,直接做一遍01背包,就可以算出合法状态下没有移动的部分的最大体积和了。

那么还有一个细节问题:dp[i][j] 中的 j 应该枚举到几呢?实际上就是求 k 时枚举到的前若干位的容积之和 lim。因为取 k 个瓶子,总容积一定不会超过 lim,所以枚举答案时也是从水量总和(因为装下这么多水的总容积至少是这个水量总和)到 lim 就可以了。

最后说一句,不要以为 dp 是两维的,计算 dp 时就只枚举 i 和 j——因为 i 只有 1~k,所以必须枚举第三个变量表示当前是第几瓶才行(我当时就这样悲剧了)。还有,j一定要记得倒序枚举。

下面就直接上代码吧:

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int n,K,tot=0,ans,lim,a[105],b[105],dp[105][10005];
struct nod
{
    int a,b,c;
}t[105];
void update(int now)   //update 跟线段树毛线关系都没有,只是求第 now 位上的空余量而已
{
    t[now].c=t[now].b-t[now].a;
}
void pour(int i,int j)  //把第 i 瓶水倒进第 j 瓶水
{
    if(t[j].c>=t[i].a)  t[j].a+=t[i].a,t[i].a=0,update(j),update(i);
    else    t[i].a-=t[j].c,t[j].a=t[j].b,update(j),update(i);
}
bool cmp(nod i,nod j)   //按照容积从大到小排序
{
    return i.b==j.b?i.a>j.a:i.b>j.b;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)   cin>>a[i],t[i].a=a[i],tot+=a[i];
    for(int i=1;i<=n;i++)   cin>>b[i],t[i].b=b[i],update(i);
    sort(t+1,t+n+1,cmp);
    int head=1,tail=n;
    while(head<tail)
    {
        if(t[head].c>=t[tail].a)    pour(tail,head),tail--;
        else    pour(tail,head),head++;
    }   //暴力往前倒水
    K=tail; //简单粗暴的求出 K
    cout<<K<<" ";
    for(int i=1;i<=K;i++)   lim+=t[i].b;
    memset(dp,-12,sizeof(dp));dp[0][0]=0;
    for(int i=1;i<=n;i++)
        for(int j=K;j>=1;j--)
            for(int k=lim;k>=b[i];k--)
                dp[j][k]=max(dp[j][k],dp[j-1][k-b[i]]+a[i]);    //转移
    for(int i=lim;i>=tot;i--)   //tot~lim 这一段都有可能是答案
        ans=max(ans,dp[K][i]);
    cout<<tot-ans;  //别忘了 ans 只是合法状态下没有移动的部分的最大体积和,t=tot-ans
}
Rust嵌入式开发环境搭建指南(基于Stm32+Vscode) 本文档旨在指导开发者如何搭建基于Rust语言的STM32嵌入式开发环境。相比传统的C/C++开发方式,Rust提供了更强的内存安全保障和现代化的语言特性,非常适合嵌入式系统开发。本指南将详细介绍从环境搭建到项目配置的全过程,特别关注VSCode作为IDE的配置以及STLink和DAPLink调试器的使用。 阅读详情

相关推荐

L298N电机驱动模块的接线使用与代码实现

#include "iostm8s208mb.h" #define u8 uint8_t #define u16 uint16_t #define u32 uint32_t typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; // 关于LED灯的宏定义 #define LED2 PI_ODR_ODR2 //输出量 #define LE

Clichong 13万+

Bottles CodeForces - 730J(限制性背包)

Nick has n bottles of soda left after his birthday. Each bottle is described by two values: remaining amount of soda ai and bottle volume bi (ai ≤ bi). Nick has decided to pour all remaining soda into...

tomjobs的博客 920

MinerU安装指南:从源码到验证的完整流程

本文详细介绍了MinerU文档转换工具的安装流程,从源码获取、依赖安装到验证步骤,提供了完整的安装指南和常见问题解决方案。特别适合技术写作者和开发者快速部署这款高效的文档转换工具,提升工作效率。

weixin_29243279的博客 546

CF730J(背包)- 省赛选拔

有n个瓶子,每个瓶子有a[i]的水,每个瓶子容量为b[i],每移动一个单位水小号1秒,问在使用最少个瓶子的前提下,移动水至少需要多少秒 省赛选拔前没做背包专题,后来做了背包专题,现在看这题还是毫无头绪。。。 状态实在太难想了,还是只会参考别人的 参考博客:背包dp #include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;...

bpdwn2017的博客 395

使用项目管理画布启动项目

许多人对商业模式画布并不陌生,它是亚历山大·奥斯特瓦德(Alexander Osterwalder)、伊夫·皮尼厄(Yves Pigneur)在《商业模式新生代》(Business Model Generation)中提出的一种用来描述商业模式、可视化商业模式、评估商业模式以及改变商业模式的通用语言。 在我们做敏捷软件项目inception(项目启动规划)的时候经常会用到商业画布,此时它的作用是帮助我们快速了解客户的业务、产品和市场,帮助客户梳理自己的资源、优势和盈利模式,总的来说,商业画布是一种简单实用的

IDEAL Garden 1224

第32篇:Vibe Coding时代:LangGraph + Redis 任务状态持久化实战,解决服务重启后任务状态丢失问题

LangGraph + Redis任务状态持久化方案 本文针对Agent任务状态丢失问题,提出基于Redis的持久化解决方案。当服务重启时,传统内存存储方式会导致任务状态丢失,影响用户体验和运维排查。 核心方案 使用Redis Hash存储任务状态,key格式为agent:task:{task_id} 设计完整状态字段包括task_id、status、progress等关键信息 实现task_store模块提供CRUD操作接口 在Agent执行各节点更新Redis中的任务状态 技术实现 通过Celery执行

sundong_81的博客 42

CodeForces 730J Bottles (DP 01背包)

Bottles Time Limit:2000MS Memory Limit:524288KB 64bit IO Format:%I64d & %I64u SubmitStatusPracticeCodeForces 730J Description Nick has n bottles of soda left after his birthday. Each bottle

MrBlank的ACM记事本 1424

学Simulink--基于新能源与储能系统的场景实例:压缩空气储能(CAES)系统热力学建模

本文介绍了使用Simulink对压缩空气储能(CAES)系统进行热力学建模的详细流程。重点讲解了系统各模块的设计方法,包括压缩机、储气装置、膨胀机和热交换器等核心组件的参数设置与计算模型。文章还提供了控制策略设计和仿真运行的具体步骤,通过建立MATLAB函数计算关键参数变化,并分析了系统性能评估指标。该建模方法可用于验证CAES系统的设计有效性,并为优化储能效率提供技术参考。全文采用模块化设计思路,为新能源与储能系统的仿真研究提供了实用案例。

xiaoheshang_123的博客 298

背包 CF730J Bottles 题解

源自 [洛谷 CF730J Bottles]有 $n$ 瓶水,第 $i$ 瓶水的水量为 $a_i$,容量为 $b_i$。将 $1$ 单位水从一个瓶子转移到另一个瓶子所消耗时间为 $1$ 秒,且可以进行无限次转移。求储存所有水所需最小瓶子数 $k$ 以及该情况下所用最小时间 $t$ 。每个水瓶有**两个值**,一个是**初始时水瓶中的水量** $val$ ,一个是水瓶的**容量** $v$ ,求通过**转移**,储存所有水所需**最小瓶子数** $k$ 以及**该情况**下转移所用**最小时间** $t$ 。

繁星之空~China锦鲤的博客 525

Qt/C++编写自定义控件49-飞机仪表盘

一、前言 飞行仪表是测定和表示飞机数据的工具,飞机中必不可少的一部分,飞行员根据飞行仪表表示的数据才能正确地做出判断。一般飞机仪表包括高度表+空速表+垂直速率表+姿态仪+航向指示表+转弯协调表。 这次要绘制的是其中的姿势仪,显示飞机相对于地平线的姿态,看姿态仪,飞行员能判断飞机姿态为偏左偏右,及偏上和偏下。姿态仪作用原理为一高度旋转的陀螺,不论飞机的姿态如何变化,此陀螺的定轴性在空间保持相同,因而...

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 7025

YOLOv8深度集成SDFM:显著增强特征细节与多尺度融合,实现小目标检测革命性提升

本文介绍了如何将SDFM(Superficial Detail Fusion Module)模块集成到YOLOv8目标检测模型中,以提升特征融合效能。SDFM通过精细的特征预校准、通道注意力机制和动态加权融合策略,有效解决了多尺度特征融合中的细节保留问题。实验表明,集成SDFM后YOLOv8的mAP50-95提升12.7%,召回率提升9.0%,精确率提升5.9%,显著增强了模型性能。教程详细阐述了SDFM的工作原理、代码实现步骤及优化思路,为研究者和开发者提供了实用的技术指南。

FJN110的博客 117

CF730J.Bottles(有限制条件的0/1背包)

题目链接:https://vjudge.net/contest/373875#problem/J 题意:给n个瓶子,每个瓶子放了一些水,现在要把这些水尽可能汇总到最少的瓶子了,问最少的瓶子数与移到这些瓶子里所要的最小代价 解题思路: 最少瓶子数很好求,直接先把水的总量rsum求出来,然后从大的容量的瓶子开始放,就能得到最少瓶子数k 求最小的代价,就相当于从总的瓶子里面找出k个能放入rsum水的瓶子,并且这些瓶子中本来的水的量最多 利用0/1背包,dp[i][j]表示容量为i、选取了j个物品的最大价值 将n个

Buyi的博客 486

keil内无法打开ccs图形编程,弹框提示:无法加载一下来源的扩展程序:C:\...清单文件缺失或不可读取,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1377

[CF730J]Bottles

Codeforces DP

YveH 1015

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

CF730J Bottles

01背包问题 题目链接 题目思路 先排序贪心找到需要的最少瓶子 再01背包求求所需瓶子内本来的水的最大值即可 因为总水量是一定的 如果最后方案瓶子中原来的水越多 则从外面往里倒的水越少即所需时间越少 我们可以用 f[m][k] 来表示 总容量为m 已经用了k个瓶子时的最大Vnomove 则有 f[j][k] = max(f[j][k], f[j - b[i]][k - 1] + a[i]) ac代码 #include <bits/stdc++.h> using namespace std;

得雨与秧晴亦好 旧冬犹有未鞭禾 242

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

J. Bottles

J. Bottles time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standard output Nick hasnbottles of soda left after his b...

weixin_30646505的博客 299

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Bottles在Linux上运行Windows软件

许多Linux用户都在寻找Wine的替代品来在Linux上运行Windows可执行文件,如果您发现自己也在做同样的事情,Bottles就是为您准备的。简单来说,这个工具通过模仿C盘提供Linux中的Windows环境,让你可以在Linux中运行不同的游戏和软件。Bottles是结合Python和Bash开发的,Bottles的当前版本是第三个版本,但如果您愿意,仍然可以使用第一个版本。否则,它可能无法在您的系统上正常运行,并且您可能会遇到错误、崩溃、错误等。...

Free雅轩的博客 2880

Codeforces 730 J.Bottles (01背包)

<题目链接> 题目大意: 有n个瓶子,各有水量和容量。现在要将这写瓶子里的水存入最少的瓶子里。问你最少需要的瓶子数?在保证瓶子数最少的情况下,要求转移的水量最少。 解题分析:首先,最少的瓶子数肯定可以通过贪心来简单求解。然后就是将所有瓶子的水量作为01背包的总体积,然后就是$dp[i][j]$表示前$i$个物品选了水量为$j$的最大容量。本题的这种逆向思维有点像那道小偷抢银行的0...

weixin_30636089的博客 193

codeforces 730 J. Bottles

这个题目题意很好理解,说的是将n个水甁中剩余的水全部倒进k个瓶子中。其中,让k最小,而且所需要倒的水最少。简单的说,就是在保证k最小的前提下,让k个瓶子中原有的水量之和最大。 想这个题目的时候也想了好一会,其实看清本质,就是一个0-1背包的问题。首先,k值最小不难确定,这里就不再多说。确定k值后,就是要确定出,这个n个瓶子中,选择哪k个才是符合要求的。对于每个瓶子,无非就是选还是不选的问题。那么

ZT在努力 922

codeforces 730J (01背包)

题目链接:点击这里题意:给出n个杯子的容量和杯内水的体积,问最少多少个杯子能够装下所有的水,以及在这个杯子数量下最少需要倒多少体积。需要的最少杯子数很好求,按照体积排个序扫一遍就能知道。然后选择某些杯子,倒水总体积就是水的总体积减去这些选中杯内的水。所以我们要在选中杯子的总容积大于等于水的总体积的前提下最大化选中的杯子中的水的总体积。考虑用dp[i][j]表示选择了i个杯子,一共j体积的水能够获得的

morejarphone~ 1326

2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest - J. Bottles(DP)

Nick has n bottles of soda left after his birthday. Each bottle is described by two values: remaining amount of soda ai and bottle volumebi (ai ≤ bi). Nick has decided to pour all remaining soda

WZJRJ28 759

2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest J Bottles

J. Bottles time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standard output Nick has n bottles of soda left after his birthday. Each b

大咸鱼。。。 900

2016-2017 ACM-ICPC NEERC - J. Bottles 二维费用背包

题目链接:http://codeforces.com/contest/730/problem/J 题目大意: 有n个瓶子。每个瓶子有饮料a[i]。瓶子的体积为b[i]。现在想把所有的饮料倒在k个瓶子里。而且每倒一升的饮料。需要花费时间1。现在希望k最小的情况下并且花费的总时间t最少。 思路:我们可以直接求k。因为要优先满足k。那么就是:sort(b+1,b+n+1):∑i=1kb[i]>=∑...

H_ang的博客 204

J. Bottles 二维费用背包问题

http://codeforces.com/contest/730/problem/J 3 4 36 1 90 45 40 其实可以知道,选出多少个瓶子呢?是确定的,当然选一些大的。 那么问题转化为: 在n个瓶子中,选出k个,然后把剩余的n - k个瓶子得液体转移过去这k个里面,费用最小。其实就是使得剩余的n - k个瓶子的拥有液体数最小,那么其实就是需要那k...

weixin_30633405的博客 153

The Geometry has no Z values 解决办法

我们在ArcEngine开发过程中进行创建要素时,简单的IFeatureClass.CreateFeature之后,然后把IGeometry对象赋给Feature.shape,会引发“The Geometry has no Z values”的错误提示。类似的错误在做地图标注过程中也会出现。 参考网上的解决方案如下, 基本思路就是在CreateFeature之后,设置Z值(顺带将M值也一并

u010212353的专栏 2872

【模拟赛】8.22模拟赛T1:数列

这道题其实比较难想,但是想出来后很好写 我们先来看一个给出的数对 bii_i,cii_i,如果我们假设它是正确的,那么就有 bii_i个数字小于 aii_i,有 cii_i个数字大于 aii_i。也就是说,aii_i的位次一定在 bii_i+1~n - cii_i之内。 那么我们就用一个 sum[i][j] 表示有多少个数字一定填在 i~j 这段区间内,然后就可以愉快的 dp 了: dp...

SSH_oj的博客 366
上一篇: 【题解】 CF550C Divisibility by Eight
下一篇: 【题解】 CF417A Elimination
SSH_oj
博客等级 码龄8年 8粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值