首页 > 其他分享 >YL 模拟赛总结 11

YL 模拟赛总结 11

时间:2024-03-02 17:13:01浏览次数:26  
标签:11 le YL int 玉米 袋数 模拟 dp 头牛

Problem


T1

略。

T2

略。

T3

结论题。

令所有牛的最终饥饿值为 \(x\),则分别对于每一头牛进行考虑:

  • 对于第一头牛,它需要的最少玉米袋数为 \(h_1-x\);

  • 对于第二头牛,它单独需要的最少玉米袋数为 \(h_2-x\),而第一头牛已经用了 \(h_1-x\) 袋玉米,因此它需要的最少玉米袋数为 \(h_2-x-(h_1-x)=h_2-h_1\)。

  • 对于第三头牛,它单独需要的最少玉米袋数为 \(h_3-x\),而第二头牛已经用了 \(h_2-h_1\) 袋玉米,因此它需要的最少玉米袋数为 \(h_3-x-(h_2-h_1)=h_3-h_2+h_1-x\)。

  • \(......\)

从上述推导可知,每一头牛需要的最少玉米袋数去掉 \(-x\) 之后每一项都是 \(h_i\) 减去前一项得到,同时每个偶数项均为 \(0\)。

而我们又发现,每一项去除 \(-x\) 之后,就变成了最终的饥饿值。

因为每个偶数项均为 \(0\),则真正对于答案有贡献的只有奇数项。

所以 \(s-\min\{m_1\}\) 即为答案,
其中 \(s\) 为初始饥饿值之和,\(m_1\) 为奇数项去除 \(-x\) 之后的值。

#include<bits/stdc++.h>
#define int long long
using namespace std;

int t,n,v,s;
int h[100031],m[2];

void solve(){
	cin>>n,s=0;
	for(int i=1;i<=n;i++) cin>>h[i],s+=h[i];
	if(n==1) cout<<0<<'\n';
	else{
		v=h[1],m[1]=h[1],m[0]=h[2];
		for(int i=2;i<=n;i++)
			v=h[i]-v,m[i%2]=min(m[i%2],v);
		if(min(m[0],m[1])<0||n%2==0&&v) cout<<-1<<'\n';
		else cout<<s-m[1]*n<<'\n';
	}
}

signed main(){
	cin>>t;
	while(t--) solve();
	return 0;
}

T4

显然是 dp。

一种很朴素的做法就是先枚举起点,再对于两个方向进行 dp。但这样做复杂度过高,无法接受。

考虑反向思考:我们往左 / 右方向 dp,其实就相当于从终点往右 / 左方向 dp,这样我们就不用枚举起点,只用考虑方向即可。

具体地,我们对于每个满足 \(1 \le i \le n\) 的 \(i\),枚举它前面的满足 \(1 \le j < i\) 的 \(j\),和满足 \(i < k \le n\) 且 \(dis_{i,k} \ge dis_{j,i}\) 的 \(k\)(\(dis_{i,j}\) 表示 \(i,j\) 之间的距离),先取到最大的前置状态 \(dp_{k,i}\),然后 \(i\) 可以选择接上之前路径,也可以单独开辟路径,在两种选择中去最优即可。反之亦然。

#include<bits/stdc++.h>
using namespace std;

int n,ans=-1e9;
pair<int,int> a[1031];
int dp[1031][1031];

int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i].first>>a[i].second,ans=max(ans,a[i].second);
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++){
		for(int j=n,k=1,mx=0;j>i;j--){
			for(;k<i&&a[j].first-a[i].first<=a[i].first-a[k].first;k++) mx=max(mx,dp[k][i]);
			dp[i][j]=max(a[i].second+a[j].second,mx+a[j].second);
			ans=max(ans,dp[i][j]);
  		}
	}
	for(int i=n;i>=1;i--){
		for(int j=1,k=n,mx=0;j<i;j++){
			for(;k>i&&a[i].first-a[j].first<=a[k].first-a[i].first;k--) mx=max(mx,dp[i][k]);
			dp[j][i]=max(a[i].second+a[j].second,mx+a[j].second);
			ans=max(ans,dp[j][i]);
  		}
	}
	cout<<ans;
	return 0;
}

标签:11,le,YL,int,玉米,袋数,模拟,dp,头牛
From: https://www.cnblogs.com/XOF-0-0/p/18048897

相关文章

  • 解决Puppeteersharp 被检测到的方法, 顺带学习了js如何实现 模拟点击拖动事件
    varlaunchOptions=newLaunchOptions{Headless=false,DefaultViewport=null,IgnoreHTTPSErrors=true,ExecutablePath=path+"\\.local-chromium\\chrome-win\\chr......
  • 代码随想录算法训练营day11 | leetcode 20. 有效的括号、1047. 删除字符串中的所有相
    目录题目链接:20.有效的括号-简单题目链接:1047.删除字符串中的所有相邻重复项-简单题目链接:150.逆波兰表达式求值-中等题目链接:20.有效的括号-简单题目描述:给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右......
  • win 11右键默认折叠改默认展开
    新建项名字:{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}InprocServer32......
  • 转载,win11删除隐藏的蓝牙设备。
     解决方案打开设备管理器:将鼠标移动到windosw11左下角开始按钮处点击右键并点击设备管理器。显示隐藏的设备:进入设备管理器后,点击最上面一行查看,选择显示隐藏的设备卸载旧的蓝牙驱动或设备:找到目前未启用的蓝牙设备或驱动(点击显示隐藏的设备后新出现的设备,一般颜色相较正......
  • 问题:模拟qq自动登录时候截不到验证码图片
    -超级鹰-注册:普通用户-登录:普通用户-题分查询:充值-创建一个软件(id)-下载实例代码-下载核心代码利用超级鹰进行图片验证的模拟登录fromseleniumimportwebdriverfromselenium.webdriver.common.keysimportKeysfromsele......
  • 射频信号源-20 GHz丨SC5510A SC5511A
    产品简介:100MHz至20GHz的输出频率范围更多信息请加weixin-pt890111获取 SC5510A和SC5511A射频信号源是基于VCO的合成信号源,具有非常低的相位噪声,在-30dBm至+15dBm的输出功率范围内,幅度控制为0.01dB。通过采用独特的多重锁相环结构,即使在1Hz步进分辨率下,整个调谐范围内的......
  • Codeforces Round 911 (Div. 2) vp D题
    前面三题,就B题一道900的题目让我wa了两发,而且有点难看出来主要是想不到。。不知道该怎么像。应该算是题目理解不清晰吧,很麻烦。。这个原因可以说是没有一个完整的思考路径,我能够直接想到答案接近的处理方法,但是细节上没有注意。在考虑问题的时候可能。。需要慢一些,太快了,容易漏......
  • Spectrum 模拟数据采集卡--M2p.59xx-x4 多达8通道同步采集,5M~125MSPS 采样率,16bit
    M2p.59xx-x4-高达125MS/s的16位数字转换器 该卡512MSample板载内存,并支持standard采集、FIFO采集、门采样,ABA等多种采集模式和时间戳。支持Windows/Linux32位和64位的操作系统驱动程序,支持C/C++,LabVIEW(Windows),MATLAB(Windows和Linux),LabWindows/CVI,IVI,.NET,Delphi,VisualBasic,Ja......
  • 111
    #include<iostream>#include"minecraft.h"usingnamespacestd;TxMinecraftmc;voidset1(intx,inty,intz){mc.drawLine(x+1+1,y,z,x+2+1,y,z,143,3);mc.drawLine(x+4+1,y,z,x+5+1,y,z,143,3);mc.drawLine(x+7+1,y,z,x+8+1,y,z,143,3......
  • 2024 蓝桥杯模拟赛3(div1+div2)
    2024蓝桥杯模拟赛3(div1+div2)P8834[传智杯#3决赛]序列简单的模拟,数据范围很小,暴力即可点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e5+5;voidsolve(){ lln,k,a[N],cnt=0; cin>>n>>k; for(inti=1;i<=n;i++)c......