【NKOJ-昨天今天和明天】考试游记

news2024/11/20 21:23:11

目录

  • 昨天上午的序列 - 30pts
  • 今天上午的扫除 - 100pts
  • 明天上午的教室 - 100pts
  • 明天上午的数组 - 100pts
  • 明天上午的函数 - 100pts
题目排序太合理了,EDCBA依次变难,导致我对着A题苦思冥想了半小时...

但是A题是[LeetCode 907. 子数组的最小值之和]的换皮题(除了题目一点没变)然鹅我还是做不出正解

A-昨天上午的序列

在这里插入图片描述

这道题是一道单调栈的变式题;

首先经过推论我们可以得到对于一个数 a k a_k ak,它会成为 l l k × r r k × a k ll_k\times rr_k \times a_k llk×rrk×ak个区间所容纳,其中 l l k ll_k llk是它左边连续的大于它的数的个数, r r k rr_k rrk是它右边连续的大于等于它的数的个数;

我们现在就是要快速求出他们的值,很简单,用两个结构体栈维护单调递增的序列和其对应的下标即可;注意我下面两个while循环当中的比较!!!不然会WA的很惨

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
int n,a[200005],ans=0,ll[200005],rr[200005];
struct lyt{
	int num,xp;//数值,下标
};
stack<lyt> l,r; 
signed main(){
	scanf("%lld",&n);for(int i=1;i<=n;i++){scanf("%lld",&a[i]);}
	l.push((lyt){0LL,0LL});r.push((lyt){0LL,n+1});//初始化成这样可以省掉边界的特判
	for(int i=1;i<=n;i++){
		if(!l.empty()){while(l.top().num>a[i]){l.pop();}}
		ll[i]+=(i-l.top().xp);l.push((lyt){a[i],i});
	}//维护ll
	for(int i=n;i>=1;i--){
		if(!r.empty()){while(r.top().num>=a[i]){r.pop();}}
		rr[i]+=(r.top().xp-i);r.push((lyt){a[i],i});
	}//维护rr
	for(int i=1;i<=n;i++){ans+=ll[i]*rr[i]*a[i];}
	printf("%lld",ans);
	return 0;
}

今天上午的扫除

在这里插入图片描述

这题非常之巧妙,关键在于这个人捡的垃圾肯定是连续的,我们可以证明,一旦捡的垃圾不连续,那么他一定会相对于连续的方案多走一些;

因而,我们只需要维护一个长度为 m m m的区间,然后算出这个捡完区间的垃圾最短时间,而最短时间的计算方法无非两种:先捡负数或后捡负数,我们只需要分类讨论就可以了;

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
int n,m,a[100005],minn=0x7fffffff,start;long long ans=0x7ffffffff;
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++){scanf("%lld",&a[i]);if(abs(a[i])<=minn){minn=abs(a[i]);start=i;}}if(a[start]<0){start++;}//start=最接近0的非负整数位置下标
	for(int l=1;l<=n-m+1;l++){
		int r=l+m-1;
		int z=max(r-start+1,0LL),f=max(start-l,0LL);//z=正(非负)数个数.f=负数个数
		if(z==0){ans=min(ans,abs(a[start-f]));}//只有负数垃圾
		else if(f==0){ans=min(ans,abs(a[start-1+z]));}//只有正数垃圾
		else{ans=min(ans,min(abs(a[start-1+z])+abs(a[start-1+z]-a[start-f]),abs(a[start-f])+abs(a[start-1+z]-a[start-f])));}//有正有负,分类讨论
	}printf("%lld",ans);
	return 0;
}

明天上午的教室

在这里插入图片描述

这道题的核心思路就是把人数转换成这个人在第几圈是可以进入这个门,方法就是:

void get(int i){
	if(!a[i]){
		num[i]=1LL;
	}else{
		int k=max(a[i]-i+1LL,0LL);if(k%n==0LL){num[i]=1+k/n;}
		else{num[i]=2LL+k/n;}
	}
	return;
}

其中num数组就是我们的第几圈的数组;这个函数的思想就是当这个人第一次到达这个门时有多少人,因为这个人下一次到这个门需要 n n n秒,所以这个门会减少 n n n人,以此内推;即可得到圈数;

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
int n,a[100005],num[100005],minn=0x7ffffffff,ans;
void get(int i){
	if(!a[i]){
		num[i]=1LL;
	}else{
		int k=max(a[i]-i+1LL,0LL);if(k%n==0LL){num[i]=1+k/n;}
		else{num[i]=2LL+k/n;}
	}
	return;
}
signed main(){
	scanf("%lld",&n);for(int i=1;i<=n;i++){scanf("%lld",&a[i]);get(i);}
	for(int i=1;i<=n;i++){if(num[i]<minn){minn=num[i];ans=i;}}
	printf("%lld",ans);
	return 0;
}

明天上午的数组

在这里插入图片描述

看起来很难,实际上只需要看数组中的有多少种不同的数字即可;

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
int n,vis[200005],a[100005],ans;
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);if(a[i]<0){a[i]=1e5+abs(a[i]);}else if(a[i]==0){continue;}
		if(!vis[a[i]]){vis[a[i]]=1;ans++;}
	}printf("%lld",ans);
	return 0;
}

明天上午的函数

在这里插入图片描述

咳咳,给这个函数加上一个记忆化和O2优化就可以轻松卡过(似乎不是正解,但是的确可以过!

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
int F[30][30][30],n,A,B,C;
long long f(int a, int b, int c) {
    if(a<0||b<0||c<0){return 1;}if(F[a][b][c]){return F[a][b][c];}
    if(a==b && a == c){return F[a][b][c]=f(a-1,b,c)+f(a,b-1,c)+f(a,b,c-1)+1;}
    if(a==b){return F[a][b][c]=f(a-1,b,c)+f(a,b-1,c)+c+1;}
    if(a==c){return F[a][b][c]=f(a-1,b,c)+f(a,b,c-1)+b+2;}
    if(b==c){return F[a][b][c]=f(a,b-1,c)+f(a,b,c-1)+a+3;}
    F[a][b][c]=f(a,b-1,c-1)+f(a-1,b,c-1)+f(a-1,b-1,c)+4;
    return F[a][b][c];
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){scanf("%lld%lld%lld",&A,&B,&C);printf("%lld\n",f(A,B,C));}
	return 0;
}

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

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

相关文章

初始OAuth2.0

1. 什么是OAuth2.0 OAuth2.0是目前使用非常广泛的授权机制&#xff0c;用于授权第三方应用获取用户的数据。 举例说明&#xff1a;用户可以通过选择其他登录方式来使用gitee&#xff0c;这里就使用到了第三方认证。 OAuth 引入了一个授权层&#xff0c;用来分离两种不同的角色…

前端工程化

一、前端工程化1、webpack&#xff08;1&#xff09;定义&#xff1a;是一个前端的构建工具。前端代码格式多&#xff08;html、css、js、图片&#xff09;&#xff0c;前端构建工具的作用是将各种格式不同文件打包到一起&#xff0c;方便项目的上线运行。&#xff08;将开发环…

Java学习笔记---干货

Java学习 一、java版本 JavaSE &#xff1a;标准版&#xff08;桌面应用程序、控制台程序&#xff09; JavaEE&#xff1a;E企业级开发&#xff08;Web端&#xff0c;服务器的开发&#xff09; JDK&#xff1a;Java开发工具 JRE&#xff1a;Java运行环境 JVM&#xff1a;…

通信原理笔记—基带信号的功率谱

目录 二进制纯随机序列基带信号的功率谱&#xff1a; 基带信号的功率谱分析&#xff1a; (1)信号(t)的功率谱&#xff1a; (2)信号v(t)的功率谱&#xff1a; 随机序列S(t)的功率谱&#xff1a; 二进制纯随机序列基带信号的功率谱&#xff1a; 基带信号的功率谱分析&#…

软件需求说明书确保正确性的6大关键点

软件需求说明书对软件开发项目非常关键&#xff0c;如何确保其正确性&#xff0c;关键有6大要点&#xff01; 1、需求与其他需求是否相互冲突或重复 一般需求规格说明书长达几百页&#xff0c;并不是一蹴而就的&#xff0c;因此可能出现前后观点的重叠或差异&#xff0c;或同一…

[HDCTF2019]Maze 题解

少欲则心静&#xff0c;心静则事简。 ——人民日报 1.查壳 是一个加了upx壳的32位EXE文件 2.使用Kali Linux脱壳 maze题目脱壳3.去除脏字节 没有找到主函数&#xff0c;发现这段汇编代码标红了&#xff0c;IDA分析崩溃&#xff0c;这是掺杂了花指令 这里jnz&#xff0c;不论判…

中国电子学会2022年03月份青少年软件编程Scratch图形化等级考试试卷三级真题(含答案)

青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;三级&#xff09; 分数&#xff1a;100 题数&#xff1a;38 一、单选题(共25题&#xff0c;共50分) 1. 以下四个选项中&#xff0c;运行哪个积木块&#xff0c;可能得到523这个数值&#xff1f;&…

25-35分布式事务seata

分布式事务Seata使用及其原理剖析 Seata的三大角色 TC (Transaction Coordinator) - 事务协调者 维护全局和分支事务的状态&#xff0c;驱动全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器 定义全局事务的范围&#xff1a;开始全局事务、提交或回滚全局事务。 RM…

devicetree和启动参数解析流程

devicetree和启动参数解析流程 文章目录devicetree和启动参数解析流程一、设备树解析概述二、early device tree 解析流程三、device node节点创建流程四、bootargs参数解析&#xff14;.1 bootargs参数配置&#xff14;.&#xff12; early param参数解析&#xff14;.&…

Docker - 2. Docker 工作原理

目录 1. Docker入门图解 2. Docker 整体架构和底层通讯原理 1. Docker入门图解 (1) Docker是一个Client-Server结构的系统&#xff0c;Docker守护进程(图中Docjer daemon)运行在主机上&#xff0c;然后通过Socket链接客户端往返&#xff0c;守护进程从客户端接收命令并管理在…

PySpark 之 SparkSQL 编程

1. DataFrame 的创建 1.1 RDD 和 DataFrame 的区别 RDD 是一种弹性分布式数据集&#xff0c;Spark中的基本抽象。表示一种不可变的、分区储存的集合&#xff0c;可以进行并行操作DataFrame是一种以列对数据进行分组表达的分布式集合&#xff0c; DataFrame等同于Spark SQL中的…

jvm宏观上类的加载机制整体和微观上通过类加载器进行加载的过程

说到一个词“类的加载”其实含有歧义&#xff0c;因为在jvm中可以说有一个宏观的&#xff0c;即整体上的类的加载&#xff0c;还有一个微观上的加载&#xff0c;也就是狭隘的通过类加载器的加载class文件的过程&#xff0c;这里介绍这两种“类的加载”。 类的整体加载过程(类加…

Windows C盘清理的正确方式,从此你告别红色烦恼

前言 伴随着电脑工作的时间越久&#xff0c;C盘常常会提示显示其内存已不足。 C盘容量不足将会极大影响系统的运行速度&#xff0c;电脑会变卡、死机。 今天&#xff0c;就给大家分享一个C盘空间清理终极解决方案&#xff1a; 1、利用Windows自己附带的磁盘清理工具 1&…

[oeasy]python0068_ 字体样式_正常_加亮_变暗_控制序列

字体样式 回忆上次内容 上次了解了一个新的转义模式 \33 逃逸控制字符 esc esc 让输出 退出标准输出流 进行控制信息的设置 可以清屏也可以设置光标输出的位置 还能做什么呢&#xff1f; 可以设置字符的颜色吗&#xff1f;&#xff1f;&#xff1f;&#x1f914; 查看细节…

BIC-2022-BDT:区块链和基于数字双胞胎的智能制造高效数据处理安全框架

摘要工业物联网具有智能连接、数据实时处理、协同监测、信息自动处理等特点&#xff0c;是物联网时代的重要组成部分之一。异构工业物联网设备对高数据速率、高可靠性、高覆盖、低延迟的要求&#xff0c;已成为信息安全领域的一大挑战。工业物联网中的智能制造产业需要多方协同…

(02)Cartographer源码无死角解析-(53) 2D后端优化→位姿图优化理论讲解、

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

【ardunio+sx1268】与【esp32+sx1268】实现不同主控单片机lora通讯

2023.21 在前文 esp32 sx1268 的 spi 驱动调通之后&#xff0c;又尝试 ardunio sx1268 驱动&#xff0c;实现不同主控对于lora模块 sx1268 的控制 文章目录1. 实验结果2.硬件描述2.1 sx12682.2 ardunio ATmega3283.接线实物图5.开发环境6.代码实现关于esp32sx1268 的驱动以及代…

爆款制作获1200w播放,B站UP主+品牌如何迈入2023

1月13日&#xff0c;bilibili 2022年度百大UP主已经揭开帷幕&#xff0c;今年延续2021年的评审标准&#xff0c;依然从专业性、影响力、创新性三个维度进行评选。来源-B站这套评审标准已经实施两年&#xff0c;早期的百大评选上榜的更多是来自知名度高、影响力广的UP主&#xf…

2.关系数据库

学习过程参考&#xff08;后续章节同&#xff09; 【公开课】数据库系统概论&#xff08;王珊老师&#xff09;&#xff08;完结&#xff09; 《数据库系统概论》思维导图 【专栏必读】数据库系统概论第五版&#xff08;王珊&#xff09;专栏学习笔记目录导航及课后习题答案详…

中国电子学会2021年09月份青少年软件编程Scratch图形化等级考试试卷三级真题(含答案)

2021-09 Scratch三级真题 分数&#xff1a;100 题数&#xff1a;38 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1. 程序中要使用不确定的数值&#xff0c;这时要用到的是&#xff1f;&#xff08;D &#xff09; A、图章 …