牛客挑战赛74(A,B,C,D)

比赛链接

这场纯纯shit,C是大讨论,D是大模拟。


A 硫酸钡之梦

思路:

发现我们到达第 i i i 个位置的时候,状态其实只有 3 3 3 个,取了的个数-未取的个数=-1,0或1。而前面的选取方式不会影响到后面的选取(无后效性),所以考虑动态规划。

d p [ i ] [ s t ] dp[i][st] dp[i][st] 表示前 i i i 个糖果,状态为 s t st st (取了-未取+1=0,1或2)的最大值。状态转移方程也比较好推:
{ d p [ i ] [ 0 ] = d p [ i − 1 ] [ 1 ] d p [ i ] [ 1 ] = m a x { d p [ i − 1 ] [ 2 ] , d p [ i − 1 ] [ 0 ] + a i } d p [ i ] [ 2 ] = d p [ i − 1 ] [ 1 ] + a i \left\{\begin{aligned} dp[i][0] & = dp[i-1][1] \\ dp[i][1] & = max\{ dp[i-1][2],dp[i-1][0]+a_i\} \\ dp[i][2] & = dp[i-1][1]+a_i \end{aligned}\right. dp[i][0]dp[i][1]dp[i][2]=dp[i1][1]=max{dp[i1][2],dp[i1][0]+ai}=dp[i1][1]+ai

code:

还能滚动数组优化

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=1e5+5;
typedef long long ll;

int n;
ll a[maxn];
ll dp[maxn][3];//前i个糖果,取了-未取+1=j 

int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	dp[0][0]=dp[0][2]=-1e18;
	for(int i=1;i<=n;i++){
		dp[i][0]=dp[i-1][1];
		dp[i][1]=max(dp[i-1][2],dp[i-1][0]+a[i]);
		dp[i][2]=dp[i-1][1]+a[i];
	}
	cout<<max(dp[n][0],max(dp[n][1],dp[n][2]));
	return 0;
}

B 伐木机不要石头!!!(easy version)

思路:

暴露了出题人是个粥p的事实

比较简单的贪心,我们用破坏力尽可能小的斧子先砍它能砍的最硬的树,依次类推。这个用两个set就能做。

不过破坏力最小的斧子它能砍的最硬的树后面的所有斧子其实也都能砍,所以让这个斧子砍硬的树,让其他斧子砍最软的树的方案我们可以替换成这个斧子砍最软的树,其他斧子砍硬树。

所以我们可以小斧子直接去砍最软的树,能砍就砍,砍不了那么说明这个斧子就没用了,直接丢掉就行了。

code:

#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;

int n,m;
int ans=0;
priority_queue<int,vector<int>,greater<int> > a,b;

int main(){
	cin>>n>>m;
	for(int i=1,t;i<=n;i++){
		cin>>t;
		a.push(t);
	}
	for(int i=1,t;i<=m;i++){
		cin>>t;
		b.push(t);
	}
	while(!a.empty() && !b.empty()){
		int ta=a.top(),tb=b.top();
		if(ta<=tb){
			a.pop();
			b.pop();
			ans++;
		}
		else {
			b.pop();
		}
	}
	cout<<ans<<endl;
	return 0;
}

C 写作业

思路:

一眼顶针,鉴定为纯纯的挠滩题目。

因为就两个科目两个人,每个情况也没有什么特别的共性,所以尝试直接讨论所有情况。

当然不可能直接硬讨论,每个人的每个科目都有两种状态:写或者抄。硬讨论的话顺序,完成时间都是个问题,情况数量爆炸。所以这里首先提出两个性质进行优化:

  1. 某个科目一定有人写,不能两个人都抄。
  2. 如果一个人既有写的任务也有抄的任务,那么他一定先进行写的任务。

第一条显然。第二条其实也比较显然,如果我们先写再抄的话,抄的时间有可能延后,除此之外就没什么影响了,但是如果先抄再写的话,抄要赶紧,写摆在后面,花的时间一定更多。

先不考虑某个人写作业的顺序,假设两个人分别叫 a , b a,b a,b,科目分别叫 1 , 2 1,2 1,2,可以分为 2 4 − 2 2 − 2 2 + 1 = 9 2^4-2^2-2^2+1=9 242222+1=9 种情况(总情况 2 4 2^4 24 个,科目 1 1 1 两人都抄的情况数 2 2 2^2 22 个,同理科目 2 2 2,减多了再加回科目 1 , 2 1,2 1,2 两人都抄的情况数 1 1 1 个):

  1. a a a 1 1 1 b b b 2 2 2,然后互相抄
  2. a a a 2 2 2 b b b 1 1 1,然后互相抄
  3. a a a 1 , 2 1,2 1,2 b b b
  4. a a a 抄, b b b 1 , 2 1,2 1,2
  5. a a a 1 , 2 1,2 1,2 b b b 1 1 1
  6. a a a 1 , 2 1,2 1,2 b b b 2 2 2
  7. a a a 1 1 1 b b b 1 , 2 1,2 1,2
  8. a a a 2 2 2 b b b 1 , 2 1,2 1,2
  9. a a a 1 , 2 1,2 1,2 b b b 1 , 2 1,2 1,2

一个人如果写两个科目,另一个人抄的话,还需要讨论写的顺序,所以严格来说其实是 15 15 15 种情况。

code:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;

ll T,a1,a2,b1,b2;

int main(){
	cin>>T;
	while(T--){
		cin>>a1>>a2>>b1>>b2;
		ll ans=1e18,t;
		
		//1
		t=max(a1,b2)+max(a2/2,b1/2);
		ans=min(ans,t);
		
		//2
		t=max(a2,b1)+max(a1/2,b2/2);
		ans=min(ans,t);
		
		//3
		t=a1+max(a2,b1/2)+b2/2;
		ans=min(ans,t);
		t=a2+max(a1,b2/2)+b1/2;
		ans=min(ans,t);
		
		//4
		t=b1+max(b2,a1/2)+a2/2;
		ans=min(ans,t);
		t=b2+max(b1,a2/2)+a1/2;
		ans=min(ans,t);
		
		//5
		t=max(a1+a2,b1)+b2/2;
		ans=min(ans,t);
		t=max(a2+a1,max(a2,b1)+b2/2);
		ans=min(ans,t);
		
		//6
		t=max(a2+a1,b2)+b1/2;
		ans=min(ans,t);
		t=max(a1+a2,max(a1,b2)+b1/2);
		ans=min(ans,t);
		
		//7
		t=max(b1+b2,a1)+a2/2;
		ans=min(ans,t);
		t=max(b2+b1,max(b2,a1)+a2/2);
		ans=min(ans,t);
		
		//8
		t=max(b2+b1,a2)+a1/2;
		ans=min(ans,t);
		t=max(b1+b2,max(b1,a2)+a1/2);
		ans=min(ans,t);
		
		//9
		t=max(a1+a2,b1+b2);
		ans=min(ans,t);
		
		cout<<ans<<endl;
	}
	return 0;
}

D 妈妈,世界是一个巨大的脑叶公司

思路:

大模拟,屎。大模拟带优化,屎中屎。

朴素的模拟想法其实很简单,用个容器把所有在场的员工信息存起来,尤其是实时的血量。对容器内的员工进行操作,每次操作后结算回合的伤害(所有员工的攻击力)。

但是操作 3 3 3 需要给全体员工的生命减掉一个值,并删去死亡的员工。如果我们真的对每个员工进行操作,会 TLE,因此考虑优化。

我们可以把怪的攻击存起来,如果总的攻击大于等于了员工血量,我们就删掉这个员工。为了快速查询血量最小的员工,我们用map存储员工信息,并按血量进行排序,同时其他操作还需要查询员工的编号,因此用双map来存。一个map存储编号到员工信息的映射,另一个存储员工信息到编号的映射,这样就可以编号和员工信息双向查询了。

但是有的员工加入容器后,之前的攻击对这个员工就不算数了,但是我们又不能为了这一次操作去把怪的攻击更新到其他员工身上,会T。所以我们仍然让新加的员工受到攻击,但是给这个员工一点补偿——设置一个护盾值。

治疗超过生命上限的部分不生效,但是我们根据前面存储的每个员工的血量,带护盾值的等效血量,怪物的攻击可以计算出员工当前剩余的生命值和护盾。然后治疗量和能接受的治疗量取较小值加到生命值上即可。也可以维护住。

这样其实就可以写了,实际写的时候可以把一些需要求和的数值动态进行维护,比如阵亡的员工个数,在场的员工总攻击力等。

code:

#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;

ll n,m,k;
ll a[maxn],b[maxn];
struct opter{
	ll hp,shl;//当前实时血量,等效血量
	ll idx;
	bool operator<(const opter x)const{
		if(shl!=x.shl)return shl<x.shl;
		return idx<x.idx;
		//这里按编号排序是必要的
		//不写的话没mp2会把血量相同的opt看成一个,然后去重 
	};
};

map<ll,opter> mp1;//编号到信息
map<opter,ll> mp2;//信息到编号 

void rm(ll idx){
	opter t=mp1[idx];
	mp1.erase(idx);
	mp2.erase(t);
}
ll atk=0,tot=0;//怪的累计伤害,我方单次伤害 
ll dead=0;//死亡人数 

int main(){
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)cin>>b[i];
	for(int i=1;i<=n;i++){
		opter t={b[i],b[i],i};
		tot+=a[i];
		mp1[i]=t;
		mp2[t]=i;
	}
	
	while(k-- && m>0 && dead!=n){
		int operat;
		cin>>operat;
		if(operat==1){
			ll x;
			cin>>x;
			opter t={b[x],b[x]+atk,x};
			mp1[x]=t;
			mp2[t]=x;
			tot+=a[x];
		}
		else if(operat==2){
			ll x;
			cin>>x;
			rm(x);
			tot-=a[x];
		}
		else if(operat==3){
			ll y;
			cin>>y;
			atk+=y;
			while(!mp2.empty() && atk>=mp2.begin()->first.shl){
				ll idx=mp2.begin()->first.idx;
				tot-=a[idx];
				dead++;
				rm(idx);
			}
		}
		else {
			ll x,h;
			cin>>x>>h;
			if(mp1.find(x)!=mp1.end()){
				opter t=mp1[x];
				
				ll cur,shell;//当前血量 护盾值 
				if(t.shl-atk>=t.hp){
					cur=t.hp;
					shell=t.shl-atk-t.hp;
				}
				else {
					cur=t.shl-atk;
					shell=0;
				}
				
				h=min(h,b[x]-cur);//治疗量
				cur+=h; 
				
				if(h>0){
					rm(x);
					t={cur,cur+shell+atk,x};
					mp1[x]=t;
					mp2[t]=x;
				} 
			}
		}
		
//		cout<<endl;
//		printf("atk=%d tot=%d dead=%d monsterhp=%d\n",atk,tot,dead,m);
//		for(auto [idx,opt]:mp1){
//			auto [hp,shl,id]=opt;
//			printf("hp:%d shl:%d id:%d\n",hp,shl,id);
//		}
//		cout<<"---------------------------------------------\n";
//		for(auto [opt,idx]:mp2){
//			auto [hp,shl,id]=opt;
//			printf("hp:%d shl:%d id:%d\n",hp,shl,id);
//		}
//		cout<<endl;

		m-=tot;
	}
	if(m<=0){
		cout<<"YES\n"<<n-dead<<endl;
	}
	else {
		cout<<"NO\n";
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【每日刷题】Day16

【每日刷题】Day16 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 2. 160. 相交链表 - 力扣&…

IGBT基本工作原理、主要参数及作用

IGBT是一种三端子的半导体开关器件&#xff0c;栅极&#xff0c;集电极和发射极。它结合了MOSFET的高输入阻抗和双极型三极管的低导通压降特性&#xff0c;广泛应用于变频器、电动汽车、电力传输等领域。 工作原理 IGBT由N沟道MOSFET和PNP双极型晶体管组成&#xff0c;其导通和…

前端ocr技术:electron+vue3中使用tesseract插件识别图片中字符

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、electron各种csp问题二、试用插件总结 前言 项目需要ocr技术识别图片中的中文字符&#xff0c;本来这部分是后端的工作&#xff0c;但是因为各种原因&#xff0c;决定前端也做一个版本。 在ai时代之前&#xff0c;o…

conda新建环境报错An HTTP error occurred when trying to retrieve this URL.

conda新建环境报错如下 cat .condarc #将 .condarc文件中的内容删除&#xff0c;改成下面的内容 vi .condarc channels:- defaults show_channel_urls: true default_channels:- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main- https://mirrors.tuna.tsinghua.…

如何评估一个RAG(检索增强生成)系统

本文首发自博客文章 如何评估一个RAG&#xff08;检索增强生成&#xff09;系统 RAG 概念最初来源于 2020 年 Facebook 的一篇论文&#xff0c;这是 Facebook 博客对论文内容的进一步解释 &#x1f449;《检索增强生成&#xff1a;简化智能自然语言处理模型的创建》。大家都知…

Vitis HLS 学习笔记--readVec2Stream 函数-探究

目录 1. 高效内存存取的背景 2. readVec2Stream() 参数 3. 函数实现 4. 总结 1. 高效内存存取的背景 在深入研究《Vitis HLS 学习笔记--scal 函数探究》一篇文章之后&#xff0c;我们对于scal()函数如何将Y alpha * X这种简单的乘法运算复杂化有了深刻的理解。本文将转向…

商家转账到零钱全攻略:开通、使用、区别与常见问题解答

商家转账到零钱是什么&#xff1f; 【商家转账到零钱】可以说是【企业付款到零钱】的升级版&#xff0c;商家转账到零钱可以为商户提供同时向多个用户微信零钱转账的能力&#xff0c;支持分销返佣、佣金报酬、企业报销、企业补贴、服务款项、采购货款等自动向用户转账的场景。…

8个Python高效数据分析的技巧

这篇文章介绍了8个使用Python进行数据分析的方法&#xff0c;不仅能够提升运行效率&#xff0c;还能够使代码更加“优美”。 1 一行代码定义List 定义某种列表时&#xff0c;写For 循环过于麻烦&#xff0c;幸运的是&#xff0c;Python有一种内置的方法可以在一行代码中解决…

MDC使用手册精讲

MDC 背景&#xff1a; 线上排查问题时&#xff0c;请求在多个微服务之间进行调用&#xff0c;并发量较大的情况下&#xff0c;想跟踪某一个请求的链路&#xff0c;是需要花费一些时间才能梳理出来&#xff0c;而且还依赖于你的业务字段。而我们需要的是快速定位&#xff0c;快…

SpringSecurity登录时在哪里调用我们自定义的UserDetailsServiceImpl

SpringSecurity登录时在哪里调用我们自定义的UserDetailsServiceImpl 1、请求login方法 2、将用户的用户名和密码封装成一个对象&#xff0c;以便进行后续的认证操作 3、执行认证操作 4、调用providermanager类的authenticate 5.进入这一步就开始跟我们自定义实现的UserDet…

【云计算】云数据中心网络(四):IPv6 网关

云数据中心网络&#xff08;四&#xff09;&#xff1a;IPv6 网关 1.什么是 IPv6 网关2.IPv6 网关设计思路3.IPv6 网关的主要应用场景3.1 IPv6 私网通信3.2 IPv6 互联网通信3.3 IPv6 互联网通信&#xff08;仅主动访问&#xff09; 1.什么是 IPv6 网关 2017 年&#xff0c;中国…

OpenHarmony实战开发-Worker子线程中解压文件。

介绍 本示例介绍在Worker 子线程使用ohos.zlib 提供的zlib.decompressfile接口对沙箱目录中的压缩文件进行解压操作&#xff0c;解压成功后将解压路径返回主线程&#xff0c;获取解压文件列表。 效果图预览 使用说明 1.点击解压按钮&#xff0c;解压test.zip文件&#xff0c…

跟着Datawhale重学数据结构与算法

数据结构和算法之前学过&#xff0c;现在跟着Datawhale重学一下&#xff0c;就当是监督自己学习&#xff0c;重新拾起来养成一个好的习惯&#xff0c;以后可以一直坚持下去。 开源链接&#xff1a;【 教程地址 】【电子网站】 首先&#xff1a; #mermaid-svg-Cdr3rn9fGCVAiKS…

文献速递:深度学习胰腺癌诊断--胰腺癌在CT扫描中通过深度学习检测:一项全国性的基于人群的研究

Title 题目 Pancreatic Cancer Detection on CT Scans with Deep Learning: A Nationwide Population-based Study 胰腺癌在CT扫描中通过深度学习检测&#xff1a;一项全国性的基于人群的研究 01 文献速递介绍 胰腺癌&#xff08;PC&#xff09;的五年生存率是所有癌症中…

记一次奇妙的某个edu渗透测试

前话&#xff1a; 对登录方法的轻视造成一系列的漏洞出现&#xff0c;对接口确实鉴权造成大量的信息泄露。从小程序到web端网址的奇妙的测试就此开始。&#xff08;文章厚码&#xff0c;请见谅&#xff09; 1. 寻找到目标站点的小程序 进入登录发现只需要姓名加学工号就能成功…

什么是线程的上下文切换?

我们知道使用多线程的目的是为了充分利用多核CPU&#xff0c;比如说我们是16核&#xff0c;但是当创建很多线程比如说160个&#xff0c;CPU不够用了&#xff0c;此时就是一个CPU来应付多个线程&#xff08;这里我们是一个CPU应对10个线程&#xff09;。这个时候&#xff0c;操作…

【LeetCode每日一题】924. 尽量减少恶意软件的传播(并查集)

文章目录 [924. 尽量减少恶意软件的传播](https://leetcode.cn/problems/minimize-malware-spread/)思路&#xff1a;并查集代码&#xff1a; 924. 尽量减少恶意软件的传播 思路&#xff1a;并查集 构建并查集&#xff1a;首先&#xff0c;代码创建了一个 UnionFind 类来维护节…

HTML 入门

HTML 简介 1. 什么是 HTML&#xff1f; 全称&#xff1a;HyperText Markup Language&#xff08;超文本标记语言&#xff09;。 超文本&#xff1a;暂且简单理解为 “超级的文本”&#xff0c;和普通文本比&#xff0c;内容更丰富。 标 记&#xff1a;文本要变成超文本&…

单例模式五种写法

单例模式五种写法 单例模式有五种写法&#xff1a;饿汉、懒汉、双重检验锁、静态内部类、枚举. 单例模式属于设计模式中的创建型模式 一、单例模式应用场景 windows的task manager(任务管理器)就是很典型的单例模式; windows的recycle bin(回收站)也是典型的单例应用&#…

防范“AI换脸”风险 ZOLOZ Deeper月超2万次攻防测试

4 月 16 日&#xff0c;深度伪造&#xff08;Deepfake&#xff09;综合防控产品ZOLOZ Deeper 在北京正式发布&#xff0c;以拦截用户刷脸过程中的“AI换脸”风险&#xff0c;目前已率先应用在身份安全领域。公开资料显示&#xff0c;ZOLOZ是蚂蚁数科的科技品牌&#xff0c;以生…
最新文章