牛客挑战赛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;//1t=max(a1,b2)+max(a2/2,b1/2);ans=min(ans,t);//2t=max(a2,b1)+max(a1/2,b2/2);ans=min(ans,t);//3t=a1+max(a2,b1/2)+b2/2;ans=min(ans,t);t=a2+max(a1,b2/2)+b1/2;ans=min(ans,t);//4t=b1+max(b2,a1/2)+a2/2;ans=min(ans,t);t=b2+max(b1,a2/2)+a1/2;ans=min(ans,t);//5t=max(a1+a2,b1)+b2/2;ans=min(ans,t);t=max(a2+a1,max(a2,b1)+b2/2);ans=min(ans,t);//6t=max(a2+a1,b2)+b1/2;ans=min(ans,t);t=max(a1+a2,max(a1,b2)+b1/2);ans=min(ans,t);//7t=max(b1+b2,a1)+a2/2;ans=min(ans,t);t=max(b2+b1,max(b2,a1)+a2/2);ans=min(ans,t);//8t=max(b2+b1,a2)+a1/2;ans=min(ans,t);t=max(b1+b2,max(b1,a2)+a1/2);ans=min(ans,t);//9t=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.mzph.cn/news/812594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pandas部分应掌握的重要知识点

目录 Pandas部分应掌握的重要知识点一、DataFrame数据框的创建1、直接基于二维数据创建&#xff08;同时使用index和columns参数&#xff09;2、基于excel文件中的数据来创建 二、查看数据框中的数据和联机帮助信息1、查看特殊行的数据2、查看联机帮助的两种常见方法&#xff0…

JavaScript教程(八)--- 正则表达式

正则表达式 正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript 中&#xff0c;正则表达式也是对象。这些模式被用于 RegExp 的 exec 和 test 方法&#xff0c;以及 String 的 match、matchAll、replace、search 和 split 方法。本章介绍 JavaScript 正则表达式。 创…

image with CV

""" 视觉&#xff1a;基本API应用&#xff08;OPENCV&#xff09; """ import cv2 import numpy as np"""图像读取方式3. 1.cv2.imread(filename or path, flags)flags0:灰度图像&#xff1b;flags1表示RGB图像&#xff1b;fl…

2024年mathorcup(妈妈杯)数学建模C题思路-物流网络分拣中心货量预测及人员排班

# 1 赛题 C 题 物流网络分拣中心货量预测及人员排班 电商物流网络在订单履约中由多个环节组成&#xff0c;图 ’ 是一个简化的物流 网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包裹按照不同 流向进行分拣并发往下一个场地&#xff0c;最终使包裹…

JavaScript教程(十三)--- 使用 Promise

使用 Promise Promise 是一个对象&#xff0c;它代表了一个异步操作的最终完成或者失败。因为大多数人仅仅是使用已创建的 Promise 实例对象&#xff0c;所以本教程将首先说明怎样使用 Promise&#xff0c;再说明如何创建 Promise。 本质上 Promise 是一个函数返回的对象&…

《黑马点评》Redis高并发项目实战笔记(上)P1~P43

P1 Redis企业实战课程介绍 P2 短信登录 导入黑马点评项目 首先在数据库连接下新建一个数据库hmdp&#xff0c;然后右键hmdp下的表&#xff0c;选择运行SQL文件&#xff0c;然后指定运行文件hmdp.sql即可&#xff08;建议MySQL的版本在5.7及以上&#xff09;&#xff1a; 下面这…

ArrayList部分底层源码分析

JDK版本为1.8.0_271&#xff0c;以插入和删除元素为例&#xff0c;部分源码如下&#xff1a; // 部分属性 transient Object[] elementData; // 底层数组 private int size; // 记录元素个数 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA {}; // 空Obje…

数据结构2:基于顺序表的通讯录项目

文章目录 头文件SeqList.hContact.h 实现文件SeqList.cContact.c 测试文件text.c 头文件 SeqList.h #pragma once#include<stdio.h> #include<stdlib.h> #include<assert.h> #include"Contact.h"#define INIT_CAPACITY 4//将顺序表数据类型调整为…

基于可变形卷积的大规模视觉基础模型的探索

基于可变形卷积的大规模视觉基础模型的探索 文章目录 基于可变形卷积的大规模视觉基础模型的探索一、简介二、亮点三、项目功能四、模型的应用1、图像模态任务性能2. 图文跨模态任务性能 五、源程序下载 一、简介 本模型包括大规模视觉基础模型"InternImage"&#x…

物联网实战--驱动篇之(五)TEA和AES加密算法

目录 一、前言 二、TEA算法 三、AES算法 四、加解密测试 五、安全性保障 一、前言 物联网的安全性是经常被提及的一个点&#xff0c;如果你的设备之间通讯没有加密的话&#xff0c;那么攻击者很容易就能获取并解析出报文的协议&#xff0c;从而根据攻击者的需要进行设备操…

MongoDB的安装和使用

1.MongoDB 安装 1.1 基于Docker安装 docker run --restartalways -d --name mongo -v /opt/mongodb/data:/data/db -p 27017:27017 mongo:4.0.6 1.2 客户端工具使用 MongoDB Compass | MongoDB 2.MongoDB 使用 2.1 引用依赖包 <dependency><groupId>org.sprin…

信号完整性的常见术语概念(面试常用)

目录 术语 概念一览 1&#xff0e;信号完整性&#xff08;Signal Integrity&#xff09; 2&#xff0e;传输线&#xff08;Transmission Line&#xff09; 3&#xff0e;特性阻抗&#xff08;Characteristic Impedance&#xff09; 4&#xff0e;反射&#xff08;Reflecti…

【环境搭建】ubuntu工作站搭建全流程(显卡4090)

安装ubuntu22.04系统 首先&#xff0c;先压缩windows分区&#xff0c;按住Win X快捷键&#xff0c;选择磁盘管理,压缩分区&#xff0c;压缩出新的分区用于安装ubuntu22.04 windows插入系统盘&#xff0c;点击重启&#xff0c;一直按F12,选择系统盘启动方式语言选择chinese–…

[react优化] 避免组件或数据多次渲染/计算

代码如下 点击视图x➕1,导致视图更新, 视图更细导致a也重新大量计算!!这很浪费时间 function App() {const [x, setX] useState(3)const y x 2console.log(重新渲染, x, y);console.time(timer)let a 0for (let index 0; index < 1000000000; index) {a}console.timeE…

【小红书校招场景题】12306抢票系统

1 坐过高铁吧&#xff0c;有抢过票吗。你说说抢票系统对于后端开发人员而言会有哪些情况&#xff1f; 对于后端开发人员来说&#xff0c;开发和维护一个高铁抢票系统&#xff08;如中国的12306&#xff09;会面临一系列的挑战和情况。这些挑战主要涉及系统的性能、稳定性、数据…

用ansys q3d提取pcb板上的寄生参数及注意事项

需求 画好pcb板后&#xff0c;想要提取回路的寄生参数 1 保存为ad格式 因为之前图方便用立创eda画的板子&#xff0c;结果无法导出成想要的格式。因此需要将立创eda的文件导出为ad格式。立创eda的官网有相关教程。 注意事项&#xff08;只说自己遇到的问题&#xff09; 导…

Ubuntu22.04 + ROS2 Humble的环境配置

Ubuntu22.04 ROS2 Humble的环境配置 文章目录 Ubuntu22.04 ROS2 Humble的环境配置(1) Set locale(2) Setup Sources(3)安装ROS2(4)检查是否成功安装 参考官方网站ROS2-Installation ROS2的各种版本及维护计划&#xff0c;可以参考ROS2-List of Distributions (1) Set locale…

Django中的静态文件、路径、访问静态文件的方法

1.什么是静态文件 不能与服务器端做动态交互的文件都是静态文件 如:图片,css,js,音频,视频,html文件(部分) 2.静态文件配置 在 settings.py 中配置一下两项内容: 1.配置静态文件的访问路径 通过哪个url地址找静态文件 STATIC_URL ‘/static/’ 说…

独一无二:探索单例模式在现代编程中的奥秘与实践

设计模式在软件开发中扮演着至关重要的角色&#xff0c;它们是解决特定问题的经典方法。在众多设计模式中&#xff0c;单例模式因其独特的应用场景和简洁的实现而广受欢迎。本文将从多个角度详细介绍单例模式&#xff0c;帮助你理解它的定义、实现、应用以及潜在的限制。 1. 什…

华为OD-C卷-结队编程[200分]

题目描述 某部门计划通过结队编程来进行项目开发, 已知该部门有 N 名员工,每个员工有独一无二的职级,每三个员工形成一个小组进行结队编程, 结队分组规则如下: 从部门中选出序号分别为 i、j、k 的3名员工,他们的职级分别为 level[i],level[j],level[k], 结队小组满…