【NKOJ三校 初中新年大联欢DIV2】考试游记

news2024/11/19 20:16:38

目录

  1. 看不见的手
  2. ljj的方块
  3. 零它来了
  4. 宝石转换
  5. ljj的距离
  6. 零它走了
  7. 彩蛋

题目

【A NKOJ-P8629】 看不见的手 40pts

A-题面

考试思路:

这道题一看数据范围就知道是 O ( n ) O(n) O(n)的结论题,考试的时候脑子抽筋偏分输出1得了40pts;

正解:

他说呆呆会使总利润最高,那我们就从呆呆的角度去思考他的最优解;不难发现,呆呆赚取的利润是   卖出点价格 − 买入点价格 {\small\ \mathsf{卖出点价格}-\mathsf{买入点价格}}  卖出点价格买入点价格;而在每个点呆呆可以买很多个口罩( T T T允许的话),所以呆呆肯定会在使数对 ( a i , a j ) (a_i,a_j) (ai,aj) a j − a i a_j-a_i ajai差值最大的 ( i , j ) (i,j) (i,j)点买入卖出;而我们要使呆呆少赚钱,我们只需要将这个数对变为: ( a i + 1 , a j )   或 ( a i , a j − 1 ) (a_i+1,a_j){\small\ \mathsf{或}}(a_i,a_j-1) (ai+1,aj) (ai,aj1),花费为1;

思路很明显了,由于使 a j − a i a_j-a_i ajai差值最大的 ( i , j ) (i,j) (i,j)可能不止一个,所以我们只需要求出这样的 ( i , j ) (i,j) (i,j)有多少个再乘上每一个数对的价值 1 1 1,就是答案

Ac Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,t,a[100005];
int minnum,maxnum,ans;
signed main(){
	scanf("%lld%lld",&n,&t);
	for(int i=1;i<=n;i++){scanf("%lld",&a[i]);}
	minnum=a[1];
	for(int i=2;i<=n;i++){
		minnum=min(minnum,a[i-1]);
		if(a[i]-minnum>maxnum){
			maxnum=a[i]-minnum;
			ans=0;
		}
		if(a[i]-minnum==maxnum){ans++;}
	}
	printf("%lld",ans);
	return 0;
}

【B NKOJ-P10089】ljj的方块 15pts

B-题面

考试思路:

输出0,直接骗分;(逃

正解:

先枚举其中任意两个有小黑子的点,在用公式推出剩余两个点的坐标,判断这两个点是否是在小黑子上,推理过程如图,其中涂色三角形是全等的,我们可以利用全等导边;(这个十分滴恶心)
B-推论
所以我们可以得到下面的结论
x 1 = y y + ( x − x x ) y 1 = x x + ( y − y y ) x 2 = y + ( x − x x ) y 2 = x + ( y − y y ) x1=yy+(x-xx) \\ y1=xx+(y-yy) \\ x2=y+(x-xx) \quad \\ y2=x+(y-yy)\quad x1=yy+(xxx)y1=xx+(yyy)x2=y+(xxx)y2=x+(yyy)

最后一定要记得除2去去重!

Ac Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
char mapp[10][10];
int n,ans=0;
struct lyt{
	int x,y;
}dis[100005];
signed main(){
	for(int i=1;i<=9;i++){
		for(int j=1;j<=9;j++){
			cin>>mapp[i][j];
			if(mapp[i][j]=='#'){
				dis[++n].x=i;dis[n].y=j;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			int x=dis[i].x,y=dis[i].y;
			int xx=dis[j].x,yy=dis[j].y;
			int x1=xx-(y-yy);
			int y1=yy+(x-xx);
			int x2=x-(y-yy);
			int y2=y+(x-xx);
			if(x1<0||x1>9||x2<0||x2>9||y1<0||y1>9||y2<0||y2>9){continue;}
			if(mapp[x1][y1]=='#'&&mapp[x2][y2]=='#'){
				printf("\nx,y:%lld %lld %lld %lld\n",x,y,xx,yy);
				printf("xxyy:%lld %lld %lld %lld\n",x1,y1,x2,y2);
				ans++;
			}
		}
	}
	printf("%lld",ans/2);
	return 0;
}

【C NKOJ-P10086】零它来了 100pts

C-题面

考试思路:

一道很水的模拟,但是要开点高科技 ,普通cin>>;cout>>:会T,我用了#pragma GCC optimize(2)+std::ios::sync_with_stdio(false); 双重优化卡过此题,这是本蒟蒻第一个Accepted的题;

Ac Code

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
int t,n,num;
string s,p;
signed main(){
	std::ios::sync_with_stdio(false);
	cin>>t;
	while(t--){
		cin>>s;n=s.size();p=s;num=0;
		if(s[0]=='0'||s[n-1]=='0'){cout<<s<<endl;continue;}
		for(int i=0;i<n;i++){
			if(s[i]=='0'&&s[i+1]=='0'){cout<<s<<endl;num=1;break;}
			if(s[i]=='0'){p[i]='_';}
		}
		if(num){continue;}
		else{cout<<p<<endl;}
	}
	return 0;
}

【D NKOJ-P10088】宝石转换 100pts

D-题面

考试思路

递归解题,以下公式中的 a [ A − n ] a[A-n] a[An]表示 a a a n n n级红宝石, b [ B − n ] b[B-n] b[Bn],表示 b b b n n n级蓝宝石;

∵ a [ A − n ] ⟺ a [ A − ( n − 1 ) ] + a x [ B − n ] ∵ a x [ B − n ] ⟺ a x [ A − ( n − 1 ) ] + a x y [ B − ( n − 1 ) ] ∵ b [ B − n ] ⟺ b [ A − ( n − 1 ) ] + b y [ B − ( n − 1 ) ] \because a[A-n]\Longleftrightarrow a[A-(n-1)]+ax[B-n] \\\because ax[B-n]\Longleftrightarrow ax[A-(n-1)]+axy[B-(n-1)]\\\because b[B-n]\Longleftrightarrow b[A-(n-1)]+by[B-(n-1)] a[An]a[A(n1)]+ax[Bn]ax[Bn]ax[A(n1)]+axy[B(n1)]b[Bn]b[A(n1)]+by[B(n1)]

∴ a [ A − n ] + b [ B − n ] ⟺ ( a + a x + b ) [ A − ( n − 1 ) ] + ( a x y + b y ) [ B − ( n − 1 ) ] \therefore a[A-n]+b[B-n] \Longleftrightarrow (a+ax+b)[A-(n-1)]+(axy+by)[B-(n-1)] a[An]+b[Bn](a+ax+b)[A(n1)]+(axy+by)[B(n1)]

以上即为推论:

Ac Code

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
int n,x,y;
int dfs(int h,int l,int a,int b){//a,b为个数,h,l为等级,按照上述结论递推(各位dalao可以用效率更高的循环代替这个)
	if(h<=1||l<=1){return b;}
	return dfs(h-1,l-1,a*(x+1)+b,a*x*y+b*y);
}
signed main(){
	scanf("%lld%lld%lld",&n,&x,&y);
	printf("%lld",dfs(n,n,1,0));
	return 0;
}

【E NKOJ-P10090】ljj的距离 70pts

E-题面

考场思路

这题很明显,不能暴力枚举,但是我们可以发现通过求 s , t s,t s,t长度的lcm再取倍数就可以优化时间复杂度;即lcm优化(自己取的)

正解

首先,lcm优化的思路没有问题,我们可以把答案表示为,其中 d d d为公倍数区间中 s , t s,t s,t之间的距离:
s l o n g × n l c m ( s l o n g , t l o n g ) × d \frac{s_{long} \times n}{\mathrm{lcm}(s_{long},t_{long})}\times d lcm(slong,tlong)slong×n×d

我们发现,我们只能优化如何求出 d d d的值;不妨逆着思考—— d d d s i ≠ t i s_i \ne t_i si=ti的个数,很明显,我们求出 s i = t i s_i = t_i si=ti的个数更容易且可以·求出 t t t值,记其为 d 1 d_1 d1

  • 当一个 s i s_i si t j t_j tj在反转后正好可以重叠,那应当有:( x , y x,y x,y是反转多少次后他们重叠,是一个未知变量)
    i + x × s l o n g = j + y × t l o n g i+x \times s_{long}=j+y \times t_{long} i+x×slong=j+y×tlong

  • 化简,即两边同时对 gcd ⁡ ( s l o n g , t l o n g ) \gcd(s_{long},t_{long}) gcd(slong,tlong)取模,可得:

i ≡ j m o d    gcd ⁡ ( s l o n g , t l o n g ) i \equiv j \mod\gcd(s_{long},t_{long}) ijmodgcd(slong,tlong)

一下子思路就很清晰了:我们只需要用一个数组number[i][j]表示对在字符串 s s s当中 gcd ⁡ ( s l o n g , t l o n g ) \gcd(s_{long},t_{long}) gcd(slong,tlong)取模值为 i i i的编号为 j j j的字母;接着遍历一遍 t t t,看一下哪些字母满足条件,遍历到一个把计数器加一,最后把计数器按照上述变形逆推回去,带入表达式中求解即可;

Ac Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,x,y;
int ans,gcds,lcms;
int number[1000005][30];
string sx,sy;
int get(char num){
	return num-'a'+1;
}
int gcd(int a,int b){
	return b?gcd(b,a%b):a;
}
signed main(){
	scanf("%lld%lld",&n,&m);
	cin>>sx>>sy;x=sx.size();y=sy.size();
	gcds=gcd(max(x,y),min(x,y));lcms=x*y/gcds;
	for(int i=0;i<x;i++){number[(i+1)%gcds][get(sx[i])]++;}
	for(int i=0;i<y;i++){ans+=number[(i+1)%gcds][get(sy[i])];}
	ans=(lcms-ans)*(n*x/lcms);
	printf("%lld",ans);
	return 0;
}

【F NKOJ-P10087】零它走了 44pts

F-题面

考场思路

爆搜!记忆化爆搜!TLE爆搜!
很明显,4s的时限也救不了我的记忆化深搜;

正解

先给大家来一张图理解一下:
讲解-F
因为我们要求的是图中 s s s的最小值,所以我们一次枚举每一座“B桥”的情况;

  • 对于第 i i i座“B桥”,是经过这座桥路径最短的“A桥”“C桥”的坐标一定是在所有“AC桥中”最靠近这座桥坐标的那一座,所以我们只需要选择对于当前B桥,应当选择左或是右边的“AC桥”即可;
  • 对于选择“AC桥”也有优化,我们先对每一组桥的坐标进行排序,然后发现:当前B桥左边的最近桥肯定在上一座B桥最近桥的右边或是就是上一座B桥最近桥,于是我们只需要提前存储上一个最近桥的编号,从那里开始枚举,知道这个桥的坐标在当前“B桥”的左边或本身;

以上即为思路,实现的时候还是有很多细节,建议诸位自己画个图模拟一下样例;

Ac Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxnum=10000000000;
int t,a,b,c;
int da[100005],db[100005],dc[100005];
int mina,minb,minc,minnum;
int nexta,nextc;
signed main(){
	scanf("%lld",&t);
	while(t--){
		scanf("%lld%lld%lld",&a,&b,&c);minnum=maxnum;nexta=nextc=1;
		for(int i=1;i<=a;i++){scanf("%lld",&da[i]);}
		for(int i=1;i<=b;i++){scanf("%lld",&db[i]);}
		for(int i=1;i<=c;i++){scanf("%lld",&dc[i]);}
		sort(da+1,da+a+1);sort(db+1,db+b+1);sort(dc+1,dc+c+1); 
		for(int i=1;i<=b;i++){
			int time_min=maxnum,drta,drtc;
			for(int j=nexta;j<=a;j++){
				if(time_min>abs(db[i]-da[j])){time_min=abs(db[i]-da[j]);drta=j;}
				if(da[j]>=db[i]||j==a){nexta=drta;break;}
			}
			time_min=maxnum;
			for(int j=nextc;j<=c;j++){
				if(time_min>abs(db[i]-dc[j])){time_min=abs(db[i]-dc[j]);drtc=j;}
				if(dc[j]>=db[i]||j==c){nextc=drtc;break;}
			}
			int longs=abs(db[i]-da[drta])+abs(db[i]-dc[drtc]);
			if(minnum>longs){minnum=longs;mina=drta;minb=i;minc=drtc;}
		}
		printf("%lld %lld %lld\n",da[mina],db[minb],dc[minc]);
	}
	return 0;
}

完结撒花-彩蛋

  • ps:这场比赛让蒟蒻有了NK彩名
  • ps:蒟蒻的第一篇游记,以后的游记都会归档在“其他特辑”当中,欢迎各位dalao批评
  • ps:最近期末考试刚刚完,所以咕了这么久才发文

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

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

相关文章

VISTA -MIT开源基于数据驱动的自动驾驶仿真引擎

引言 VISTA 是MIT开源的一个基于数据驱动的用于自动驾驶感知和控制的仿真引擎。VISTA API提供了一个接口&#xff0c;用于将真实世界的数据集转换为具有dynamic agents、sensor suites、task objectives的虚拟环境。 用过 Unreal Engine 或者 Gazebo的仿真引擎的同学都知道&…

【Kafka】八股文梳理

什么是消息中间件&#xff1f; 消息中间件是基于队列与消息传递技术&#xff0c;在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统。 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流&#xff0c;并基于数据通信来进行分布式系统的集成。…

Android Native开发系列之C/C++代码调试

Android Native开发系列之C/C代码调试 引言 在做Android native层开发的时候&#xff0c;需要经常调试C/C代码&#xff0c;相较而言通过打日志的方式太不方便了。有两种方式可以进行底层代码的调试。 利用Android studio自带的Debugger进行调试。利用LLDB VSCode进行代码调试…

SAP灵活工作流条件增强

前置 灵活工作流模板中可以设置条件&#xff0c;用来在场景配置中判断是否启动流程或者是否执行该节点 除了流程模板中设置&#xff0c;也可以通过增强设置更为灵活的条件判断,对应增强点SWF_PROCESS_WORKFLOW_CONDITION 增强实施步骤参考 创建增强点实施 复制示例类 为增强设…

深入聊一聊vue3中的reactive()

在vue3的开发中&#xff0c;reactive是提供实现响应式数据的方法。日常开发这个是使用频率很高的api。这篇文章笔者就来探索其内部运行机制。小白一枚&#xff0c;写得不好请多多见谅。 调试版本为3.2.45 什么是reactive? reactive是Vue3中提供实现响应式数据的方法. 在Vue2中…

【Dash搭建可视化网站】项目9:智能选股器(结合行业、换手率、量比与60日k线图选择目标股票)制作步骤详解

【Dash搭建可视化网站】项目9&#xff1a;智能选股器&#xff08;结合行业、换手率、量比与60日k线图选择目标股票&#xff09;1 项目效果图2 项目架构3 文件介绍和功能完善3.1 assets文件夹介绍3.2 app.py和index.py文件完善3.3 layoutleft.py文件完善3.4 api.py和api.ipynb文…

【数据结构趣味多】栈和队列(详细解析)

目录 1.1 栈的定义 1.2 栈的模拟实现&#xff08;顺序栈&#xff09; push()方法 pop()方法 peek()方法 size()方法 栈模拟实现的全代码 1.3顺序栈和链栈的对比 2.队列 2.1队列的定义 2.1队列的模拟实现&#xff08;单链表&#xff09; offer()函数 poll()函数 p…

ABB AC500 PLC 与西门子 S7-300 CPU DP 通讯

硬件连接 将一个 AC500 CPU&#xff08;本例 PM583&#xff09; 左侧插入以 DP 通讯扩展模块 CM572&#xff0c;使用 DP 通讯电缆连接 CM572 与 314-2DP CPU 的 DP 通讯口。连接示意图如下&#xff1a; AC500 DP 主站配置 安装 DP 从站设备描述文件 从西门子官方网站下载 CP…

认识二叉树

hi&#xff0c;代噶候。今天带大家认识一下二叉树&#xff0c;这个二叉树在我看来确实很有难度&#xff0c;但是不要怕&#xff0c;&#xff0c;鲁迅先生曾经说过&#xff0c;真正的勇士敢于面对惨淡的人生&#xff0c;敢于正视淋漓 的鲜血&#xff0c;下面让我们开始吧&#x…

线程池的内部结构与原理解析

线程池的内部结构 使⽤线程池的原因&#xff1a; 1、降低资源消耗 2、控制并发的数量。并发数量过多&#xff0c;可能会导致资源消耗过多&#xff0c;从⽽造成服务器崩溃 3、提高线程的可管理性 1、线程是稀缺资源&#xff0c;如果无限制地创建&#xff0c;不仅会消耗系统资源&…

Global Illumination_SDF Generate Visualize Shadow

Signed Distance Field(有向距离场)&#xff0c;简称SDF&#xff0c;这其实是图形学中非常常用的数学概念。数学上来说&#xff0c;是定义在空间中的一个标量场&#xff0c;标量值为空间一点到曲面的距离。曲面外的点为正值&#xff0c;曲面上的点为0&#xff0c;曲面内的点为负…

通用vue组件化展示列表数据

一、数据的简单展示 1.首先先确定要展示的表格列名以及拿到所需要展示的数组数据 2.然后建立一个专门放el-table遍历的文件 3.在父组件中将数据列表数据存放在listData里面&#xff0c;然后传给子组件&#xff0c;子组件定义一个动态的列&#xff0c;通过遍历propList得到列名…

SpringCloud从入门到精通(八)

config config-概述 • Spring Cloud Config 解决了在分布式场景下多环境配置文件的管理和维护。 • 好处&#xff1a; 集中管理配置文件 不同环境不同配置&#xff0c;动态化的配置更新 配置信息改变时&#xff0c;不需要重启即可更新配置信息到服务config-快速入门 gitee搭…

一文告别结合Nacos后,Springboot的配置文件看不懂的痛苦

一、背景 后端基于SpringCloud项目架构的话&#xff0c;默认会使用Nacos来做配置中心&#xff0c;但是这对从来没接触过Nacos配置中心的小伙伴&#xff0c;肯定就不知道怎么回事了&#xff0c;于是便有了这一篇指引。 二、Nacos配置中心是如何引入SpringCloud项目中的呢&…

操作系统实验8:proc文件的实现

实验目的 掌握虚拟文件系统的实现原理实践文件、目录、索引节点等概念 实验内容 在Linux 0.11上实现procfs&#xff08;proc文件系统&#xff09;内的psinfo结点。当读取此结点的内容时&#xff0c;可得到系统当前所有进程的状态信息。例如&#xff0c;用cat命令显示/proc/p…

有限状态机

文章目录1.概念2.什么是计算3.什么是有限状态机3.1特性3.2为什么要用状态机4.实战4.1字符串转换整数4.2用有限状态机实现4.3源码1.概念 有限状态机&#xff08;英语&#xff1a;finite-state machine&#xff0c;缩写&#xff1a;FSM&#xff09;又称有限状态自动机&#xff0…

【手写 Vue2.x 源码】第十篇 - 数组数据变化的观测情况

一&#xff0c;前言 上篇&#xff0c;主要介绍了对象数据变化的观测情况&#xff0c;涉及以下几个点&#xff1a; 实现了对象老属性值变更为对象、数组时的深层观测处理&#xff1b; 结合实现原理&#xff0c;说明了对象新增属性不能被观测的原因&#xff0c;及如何实现数据…

综合案例二 旅游网【1.项目导入技术选型注册表单校验登录退出表单】注册表空指针异常和其他一些错误

目录 前提&#xff1a;项目导入 在maven中点击travel项目&#xff08;这里我是将项目添加到hello_maven里 &#xff09; 1.启动项目 方式一&#xff1a;maven命令启动 方式二&#xff1a;配置maven快捷启动 2.技术选型 1 Web层 2 Service层 3 Dao层 3.创建数据库…

56/14 shell脚本 后台启动 程序1 + “tail -f log“, ctrl +c 导致程序1中断

前言 接上一篇文章, node 程序后台执行加上 tail 命令, 中断 tail 命令, 同时也中断了 node 程序 我们来详细 参照对比一下 这个问题的各种情况 主要的脚本如下类似, 第一条命令 后台启动 程序1, 然后 第二条命令 tail -f 查看日志 然后 ctrlc 中断 "tail -f" …

实现自己的打印函数

文章目录前言前置知识代码说明实验操作单字符打印字符串打印整形字符串打印前言 本博客记录《操作系统真象还原》第六章实验的操作~ 实验环境&#xff1a;ubuntu18.04VMware &#xff0c; Bochs下载安装 实验内容&#xff1a; 实现 put_char 单字符打印输出函数。实现 put_…