首页 > 其他分享 >P4870 [BalticOI 2009 Day1]甲虫 题解

P4870 [BalticOI 2009 Day1]甲虫 题解

时间:2023-02-08 13:34:31浏览次数:65  
标签:val int 题解 ll Day1 水量 P4870 include 水滴

题目链接

简要题意

在一个数轴上有 \(n\) 滴露水,每滴露水初始水量为 \(m\),每秒会蒸发一滴水,一个甲虫初始在原点,速度为 1,水能瞬间喝完,问它最多能喝到几滴水。

题目分析

对于这种移动区间连续的题目,我们首先考虑区间 dp,记 \(f_{l,r,0}\) 表示喝完区间 \([l,r]\) 的水且在左边表示的最小时间,第三维为 1 的时候在右边,据此设计转移。

但是我们发现本题中多了一维时间,强行增加维度时间复杂度会爆,我们考虑控制变量。

可以发现,上述转移最大的问题在于我们不知道转移之后每个水滴的剩余水量,而剩余水量和最多的水都可以通过已蒸发的水量和总共经过的水滴数求出,转换后复杂度降低,符合我们的要求。

于是我们把储存对象改为已蒸发水量,外层枚举一个总共经过的水滴数,定义喝完当前的水后还差 \(k\) 滴水没喝,\(val\) 为排序后的水滴横坐标,可以得到状态转移方程:

\(f_{l,r,0}=min(f_{l+1,r,1}+k*|val_r-val_l|,f_{l+1,r,0}+k*|val_{l+1}-val_l|)\)

\(f_{l,r,1}=min(f_{l,r-1,1}+k*|val_r-val_{r-1}|,f_{l,r-1,0}+k*|val_{l}-val_{r}|)\)

实现时还需要注意特判只喝一个水滴时的边界情况。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
ll n,m;
ll val[1000001];
ll dp[301][301][2];
ll calc(int lim){
	ll ans=0x3f3f3f3f3f3f3f3f;
	for(int len=1;len<=lim;len++){
		for(int l=1;l+len-1<=n;l++){
			int r=l+len-1;
			if(len==1)dp[l][r][0]=dp[l][r][1]=lim*abs(val[l]);
			else{
				dp[l][r][0]=dp[l][r][1]=0x3f3f3f3f3f3f3f3f;
				dp[l][r][0]=min(dp[l][r][0],dp[l+1][r][0]+(lim-len+1)*abs(val[l+1]-val[l]));
				dp[l][r][0]=min(dp[l][r][0],dp[l+1][r][1]+(lim-len+1)*abs(val[r]-val[l]));
				dp[l][r][1]=min(dp[l][r][1],dp[l][r-1][1]+(lim-len+1)*abs(val[r]-val[r-1]));
				dp[l][r][1]=min(dp[l][r][1],dp[l][r-1][0]+(lim-len+1)*abs(val[l]-val[r]));
			}
			if(len==lim) ans=min(ans,min(dp[l][r][0],dp[l][r][1]));
		}
	}
	return ans;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>val[i];
	sort(val+1,val+n+1);
	ll ans=0;
	for(int i=1;i<=n;i++)ans=max(ans,i*m-calc(i));
	cout<<ans<<endl;
}

标签:val,int,题解,ll,Day1,水量,P4870,include,水滴
From: https://www.cnblogs.com/eastcloud/p/17101408.html

相关文章

  • CF1693 ABCD 题解
    题目链接:https://codeforces.com/contest/1693这场的题都非常好啊……因为现在是从div1开始做了,所以可能刚开始会有点吃力(这场我就会做一个1B呜呜呜)1A先把后缀的极......
  • USACO 2023 January Contest, Platinum 题解
    TractorPaths题意:给定\(n\)个不交区间,两个区间之间有边当且仅当这两个区间的交非空。\(Q\)次询问,每次给定\(u,v\),求从\(u\)到\(v\)的最短路和最短路可能经过的点......
  • 黑苹果中Memory modules misconfigured问题解决
    问题大致和这个差不多,头一样,下面的不一样:大致意思是,你的内存出现了错误设置,要么成对安装,要么把模块全插满。以前版本没有这个信息,那就一定是配置造成的。按照https://dor......
  • CF14D题解
    CF14DTwoPaths题解题目链接传送门题意简述给定一棵树,找出两条不经过相同点的最长路径,使得他们的长度乘积最大。题目分析首先,如果在一棵树上,两条路径没有共同的点,那......
  • CF1785B Letter Exchange 题解(思维+模拟)
    题目链接难度:绿+。题意给定\(t\)组testcase,每组testcase如下。有\(m\)个长度为3的字符串,每个字符都是\(\text{w}\)、\(\text{i}\)、\(\text{n}\)中的一个,一......
  • C++ Day14 借助智能指针实现文本查询查询
    一、设计思路数据结构:1、读取文件时,要记住文件的每一行,并且要将每一行分解为独立的单词vector<string>vec;istringstream2、输出时提供每个单词与其关联的行号,且......
  • HDU5126 stars题解
    HDU5126Description\(T\)组数据,给一个空的三维空间,\(Q\)次操作,分为插入一个点和查询某个立方体内点的个数。\(T\le10,Q\le5\times10^4\)Sol题目没说强制在线......
  • CF1333F Kate and imperfection 题解 线性筛
    题目链接:http://codeforces.com/problemset/problem/1333/F题目大意:kate有一个集合S,S中的元素是1到n的整数她认为集合S的一个子集M的集合的不完美值等于\(\max_{a,b\in......
  • 消息队列的延时以及过期失效,消息队列消息积压及占满问题解决思路
    大量消息在mq里积压了几个小时了还没解决几千万条数据在MQ里积压了七八个小时,从下午4点多,积压到了晚上11点多。这个是我们真实遇到过的一个场景,确实是线上故障了......
  • CF1787I Treasure Hunt 题解
    题目链接题意描述:定义一个序列的权值为一段前缀与一段子段,满足要么前缀与子段不交,要么完全包含的和的最大值,给定一个序列\(a\),求\(a\)的所有子区间的权值和\(n\le1......