【马蹄集】第十一周作业

news2024/11/28 18:52:13

第十一周作业



目录

  • MT2012 竹鼠的白色季节
  • MT2013 照亮街道
  • MT2014 打靶
  • MT2026 二维坐标点移动
  • MT2027 一秒成零




MT2012 竹鼠的白色季节

难度:黄金    时间限制:1秒    占用内存:250M
题目描述

小码哥的竹鼠养殖场中的竹鼠都在一条直线的隔间里,一共有 n ( 1 ≤ n ≤ 100000 ) n(1≤n≤100000) n(1n100000) 只竹鼠,它们的坐标分别为 p 1 , p 2 , p 3 , … , p n ( 0 ≤ p i ≤ 1 0 8 ) p_1, p_2,p_3,…,p_n (0≤p_i≤10^8 ) p1,p2,p3,,pn(0pi108)
又到了冬季,竹鼠们也要谈恋爱,因为竹鼠们都太胖了,它们的活动范围有限,这里统一规定它们的活动范围为 d ( 0 ≤ d ≤ 1 0 4 ) d(0≤d≤10^4 ) d(0d104)
由于竹鼠之间也需要双向奔赴,所以如果两只竹鼠之间的距离小于等于 d d d,则称它们是有缘的一对竹鼠,问小码哥的养殖场里一共有多少对有缘的竹鼠?
注:一只竹鼠可能存在于多个有缘的竹鼠对之中,多只竹鼠可能在同一个坐标上。

格式

输入格式:第一行为两个用空格隔开的数字 n n n d d d;;
     第二行为 n n n 个整数,表示 n n n 只竹鼠在直线上的坐标。
输出格式:输出一个整数,表示有缘的竹鼠对 。

样例 1

输入:5 3

   1 2 4 8 9

输出:4


相关知识点: 枚举


题解


题目说了很多,但实际只需要知道一件事即可:“如果两只竹鼠之间的距离小于等于 d d d,则称它们是一对有缘的竹鼠,问小码哥的养殖场里一共有多少对有缘的竹鼠?”。所以,本题实际上就是让我们统计位置差距超过一定范围的数对。

具体的求解思路很简单,将所有竹鼠的位置进行排序,然后再扫描排序后的数组并统计满足要求的差距即可,但是有一点需要注意,在统计差距时为了避免重复(因为对于一对有缘的竹鼠而言,两个竹鼠各自在计算差距时都会将彼此纳入计算),我们只进行 “单向” 统计,具体实现如下(已 AC):

/*
    MT2012 竹鼠的白色季节 
*/

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

const int MAX = 100005;
int ary[MAX];

int getPredestined(int ary[], int n, int d)
{
    int predestined = 0;
    
    // 对竹鼠的位置数组进行排序
    sort(ary,ary+n);
    
    // 扫描全部竹鼠以寻找有缘鼠
    // 注:为避免重复统计,规定进行单向寻找(下面的代码执行后向配对)
    for(int i=0;i<n-1;i++) 
        for(int j=i+1;j<n;j++)
            if(ary[j]-ary[i] <= d) predestined++;
            else break;
    
    return predestined;
}

int main( )
{
    // 录入数据 
    int n, d; cin>>n>>d;
    for(int i=0;i<n;i++) cin>>ary[i];
    
    // 输出有缘的竹鼠对 
    cout<<getPredestined(ary, n, d)<<endl;
     
    return 0;
}


MT2013 照亮街道

难度:黄金    时间限制:1秒    占用内存:128M
题目描述

有一条可以视为线段的街道,长度为 L L L,其中有 n n n 个路灯,每个路灯能照亮的半径都是相同的,求最小的照亮半径 r r r 使得整条街道上的每一个点都能被照亮。

格式

输入格式:第一行两个正整数 n , L n,L nL
     第二行为 n n n 个实数,表示 n n n 个路灯的坐标,数据保证在 0 0 0 L L L 之间。
输出格式:输出一行一个实数表示答案,答案保留两位小数。

样例1

输入:7 15
   15 5 3 7 9 14 0

输出:2.50

备注

其中: n ≤ 1000 , L ≤ 1 0 9 n≤1000,L≤10^9 n1000,L109


相关知识点:枚举


题解


求解此题最简单的办法就是暴力枚举。由于题目让我们保留两个小数,因此求解步骤可以从 0.01 开始进行枚举,直到某个半径长度能够将整条街都照亮时,该半径即为所求。

但是从数学的角度出发,肯定有更好的算法。

对于这条路灯间距不一致的街而言,如果要让所有地方都充满光明,则路灯的照明半径肯定只取决于那段“路灯隔得最远的路段”。比如,在题目给出的数据中,从下图可以很明显地看出,其只取决于路灯 9 和 14 的距离。

在这里插入图片描述

因此,我们的求解目标就从“找最小半径”,转换为“找最远路灯”。最远路灯的求解就很简单了:对路灯的位置数组进行排序,然后遍历该数组求差分的最大值即可。但是!一定要注意两个端点位置(即绝对位置为 0 和 L 处)的与路灯的差距,这需要单独计算!并参与对最大值的比较。

下面给出基于以上思路写出的完整代码(已 AC):

/*
    MT2013 照亮街道 
*/

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

const int MAX = 1005;
// 注:用 float 只能通过一个例子,这里必须用 double 
double ary[MAX];

int main( )
{
    // 录入数据 
    int n, L; cin>>n>>L;
    for(int i=0;i<n;i++) cin>>ary[i];
    
    // 对路灯数组排序 
    sort(ary,ary+n);
    
    // 求差距最大的间隙
    double gap=0;
    for(int i=0;i<n-1;i++)
        gap = max(gap,ary[i+1]-ary[i]);
    
    // 与路段的首尾间隙进行比较
    gap = max(gap/2, max(ary[0],L-ary[n-1]));
    
    // 输出操作次数(注意格式控制) 
    printf("%.2f\n", gap);
     
    return 0;
}


MT2014 打靶

难度:黄金    时间限制:3秒    占用内存:128M
题目描述

小码哥在练习射箭,他要射穿 n n n 个靶子,且每个靶子有高度 h i h_i hi。箭会因为受到靶子的摩擦力而下坠,当射穿一个靶子后箭的高度会下降 1。小码哥可以射任意高度的箭。
求出小码哥最少需射几箭。

格式

输入格式:第一行一个整数 n n n
     第二行 n n n 个整数 h i h_i hi
输出格式:输出一个整数,表示小码哥最少需要射几箭。

样例 1

输入:5
   2 1 5 4 3
输出:2

备注

其中: 1 ≤ n , h i ≤ 1 0 6 1≤n,h_i≤10^6 1n,hi106
小码哥与靶子的占位如下(不会有两个相邻的靶子紧紧贴在一起):
小码哥 ——> 靶子1,靶子2,靶子3,……,靶子n。


相关知识点:模拟枚举


题解


题目的意思很简单:射出的箭具有无限射程,但是每当该箭射穿一个靶子时就会降低1个单位的高度。现在有一系列的靶,问最少要射几支箭才能把这些靶都击穿。

题目给出的测试数据如下:

在这里插入图片描述

显然,两支箭就能将所有靶全部击倒(顺序可任意):
取第一支箭高度为2,它在射穿0号靶子后,会顺势射穿1号靶;
取第二支箭高度为5,它在射穿2号靶子后,会顺势射穿3、4号靶;
这样就能用最少的箭将全部靶子都射穿。

接下来我们来思考这里面的奥义。首先要知道一件事,箭的射程是无限的,对于射出的任意箭,它必定能将一系列高度为等差递减序列的靶子全部射穿。这实际上提示了我们,该题就是让我们其统计高度连续递减靶子的丛数。但要注意一件事,这个等差递减序列的先后关系必须和各靶子的相对位置对应。因此,我们在模拟这个射箭的过程时,要考虑到这一点。所以现在问题的关键就在于,如何去记录高度连续递减靶子的丛数?要知道,对于题目输入的靶子而言,那些高度连续递减靶子位置可能本身并不连续。

这里提供一种简单有效的办法:高度消融。具体做法是,对于输入的高度,我们每次都将当前高度进行下沉,这样最终就能把不同位置的具有连续递减性质的丛数给记录下来。例如,对于高度序列:{5,3,4,3,1},系统第一次运行时,高度数组 height[ ]={0}为空:

  1. 输入高度 5,由于这之前并没有这个高度(即 height[5]==0),说明当前这个高度是第一个,因此需要记 cnt=1,然后将其下沉,即现在高度数组的内容为:height[5-1]=height[4]++,即 height={0,0,0,0,1,0};
  2. 输入高度 3,由于这之前并没有这个高度(即 height[3]==0),说明当前这个高度是第一个,因此需要记 cnt=2,然后将其下沉,即现在高度数组的内容为:height[3-1]=height[2]++,即 height={0,0,1,0,1,0};
  3. 输入高度 4,由于当前高度数组存在 height[4] 非0,说明当前高度存在着从上一次消融下来的数据,也就是说在这之前射出了一支高度为 4+1=5 的箭,那么当前位置将被射穿。因此,要将当前位置进行消融并下沉,于是置 height[4]–,height[4-1]=height[3]++,即 height={0,0,1,1,0,0};
  4. 输入高度 3,由于当前高度数组存在 height[3] 非0,说明当前高度存在着从上一次消融下来的数据,也就是说在这之前射出了一支高度为 3+1=4 的箭,那么当前位置将被射穿。因此,要将当前位置进行消融并下沉,于是置 height[3]–,height[3-1]=height[2]++,即 height={0,0,2,0,0,0};
  5. 输入高度 1,由于这之前并没有这个高度(即 height[1]==0),说明当前这个高度是第一个,因此需要记 cnt=3,然后将其下沉,即现在高度数组的内容为:height[1-1]=height[0]++,即 height={1,0,1,0,0,0}。

算法结束,输出计数cnt即得到了最终需要的最少的箭数。

根据这样的思路可写出求解本题的完整代码(已 AC):

/*
    MT2014 打靶 
*/

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

const int MAX = 1000005;
int ary[MAX];

int main( )
{
    int n, height, cnt=0; cin>>n;
    while(n--){
        // 获取当前靶子的高度 
        cin>>height;
        
        // 根据当前靶子高度是否存在决定是否消融和计数 
        ary[height]?ary[height]--:cnt++;
        
        // 执行下沉 
        ary[height-1]++;
    }
    cout<<cnt<<endl;     
    return 0;
}


MT2026 二维坐标点移动

难度:黄金    时间限制:1秒    占用内存:128M
题目描述

给定一个 N ∗ M N*M NM 的二维坐标矩阵A,并且给定一个整数K,K表示移动步数,矩阵A中的所有点 A [ i ] [ j ] A[i][j] A[i][j] 的移动操作如下:

  1. A [ i ] [ j ] A[i][j] A[i][j] 移动到 A [ i ] [ j + 1 ] ( j ≤ M − 2 ) A[i][j+1](j ≤ M-2) A[i][j+1]jM2
  2. A [ i ] [ M − 1 ] A[i][M-1] A[i][M1] 移动到 A [ i + 1 ] [ 0 ] ( i ≤ N − 2 ) A[i+1][0](i ≤ N-2) A[i+1][0]iN2
  3. A [ N − 1 ] [ M − 1 ] A[N-1][M-1] A[N1][M1] 移动到 A [ 0 ] [ 0 ] A[0][0] A[0][0]

最后输出移动K次后新的二维坐标矩阵A。

格式

输入格式:第一行输入两个整数 N, M;
     接下来 N 行,每行 M 个数,即 A [ i ] [ j ] ( 0 ≤ i ≤ N , 0 ≤ j ≤ M ) A[i][j](0 ≤ i ≤ N, 0 ≤ j ≤ M) A[i][j]0iN,0jM
     最后一行一个整数 K。
输出格式:N 行,每行 M 个数,即修改之后的 A [ i ] [ j ] A[i][j] A[i][j]

样例 1

输入:3 3
   1 2 3
   30 40 50
   10 20 30
   2

输出:20 30 1
   2 3 30
   40 50 10

备注

其中: 1 ≤ N , M ≤ 50 , − 1000 ≤ A [ i ] [ j ] ≤ 1000 , 0 ≤ K ≤ 1000 1≤N,M≤50,-1000 ≤ A[i][j]≤ 1000,0 ≤ K ≤ 1000 1N,M50,1000A[i][j]1000,0K1000


相关知识点: 模拟


题解


实际上,这道题的要求是“将矩阵中的每个元素往后移动K个单位”。由于处理对象是一个矩阵,因此在将其中的元素向后移动时有3个情况(假设矩阵规格为 N ∗ M N*M NM,索引从0开始):

  1. 待移动元素位于矩阵最右下角的位置(即 A [ N − 1 ] [ M − 1 ] A[N-1][M-1] A[N1][M1]),这种情况,其下一个位置为矩阵的最开始位置(即 A [ 0 ] [ 0 ] A[0][0] A[0][0]);
  2. 待移动元素位于矩阵任意行(除最后一行)的末尾(即 A [ i ] [ M − 1 ] A[i][M-1] A[i][M1]),这种情况,其下一个位置为该元素所在下一行的最开始位置(即 A [ i + 1 ] [ 0 ] A[i+1][0] A[i+1][0]);
  3. 待移动元素位于除1和2以外的任意位置(设为 A [ i ] [ j ] A[i][j] A[i][j]),这种情况,其下一个位置为 A [ i ] [ j + 1 ] A[i][j+1] A[i][j+1]

在这里插入图片描述

从上面的分析不难看出,其变换规则还是很简单的。因此,最简单直接的办法就是设计一个规格和输入数据一致的二维数组,然后遍历原始数据,通过 switch 控制不同类型的数据进行位置变换并存储即可。这样的方式显然是可行的。

但仔细思考上面的三个情况,不难发现其本质都是在描述“将数据向后移动若干位”的含义。因此,为了简化上述复杂的分情况讨论环节,我们可以用一种更简单的方式进行:将原始数据存储至一维空间,执行“将数据向后移动若干位”后再按二维的方式进行输出。

根据这样的思路最终可得到以下代码(已 AC):

/*
    MT2026 二维坐标点移动 
*/
 
#include<bits/stdc++.h> 
using namespace std;

const int MAX = 2505;
int ary[MAX], offset[MAX]; 

int main() 
{ 
    // 录入数据 
    int n, m, k; cin>>n>>m;
    int LEN = n*m;
    for(int i=0;i<LEN;i++) cin>>ary[i];
    cin>>k;
    
    // 对数组进行移位处理 
    for(int i=0;i<LEN;i++) offset[(i+k)%LEN] = ary[i];
    
    // 输出数据
    k = 0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++)
            cout<<offset[k++]<<" ";
        cout<<endl;
    }
    return 0; 
}


MT2027 一秒成零

难度:白银    时间限制:1秒    占用内存:128M
题目描述

给定一个正整数 n ,请写一个函数 Steps,将 n 通过以下操作变成0,并且返回操作次数。

  1. n 为偶数,则 n=n/2;
  2. n 为奇数,则 n=n-1。
格式

输入格式:第一行输入正整数 n n n
输出格式:输出操作次数。

样例1

输入:14

输出:6

备注

其中: 1 ≤ n ≤ 1 0 7 1≤n≤10^7 1n107


相关知识点:模拟


题解


这是一道纯模拟题,照题目意思做就行。要么递推要么递推(取决于鉴于数据范围),下面给出求解的两个算法:

/*
   MT2027 一秒成零
     
*/

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

// 递推实现(数的取值范围较大时宜用) 
int Steps(int n){
    int optCnt = 0;
    while(n){
        if(n&1) n--;
        else n/=2;
        optCnt++;
    }
    return optCnt;
} 

// 递归实现 
int Steps_(int n){
    if(n==0) return 0; 
    if(n&1) return Steps(n-1)+1;
    return Steps(n/2)+1; 
} 

int main( )
{
    // 获取输入 
    int n; cin>>n;
    
    // 输出操作次数
    cout<<Steps(n);
     
    return 0;
}

END


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

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

相关文章

深度学习笔记之递归网络(一)引子:序列模型

深度学习笔记之递归网络——引子&#xff1a;序列模型 引言回顾&#xff1a;齐次马尔可夫假设序列模型序列信息序列数据建模 引言 从本节开始&#xff0c;将介绍递归网络系列。本节将介绍序列模型。 回顾&#xff1a;齐次马尔可夫假设 齐次马尔可夫假设——在隐马尔可夫模型…

LeetCode 124. 二叉树中的最大路径和

124. 二叉树中的最大路径和 描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一…

收藏|必读10本pcb设计书籍推荐

1."High-Speed Digital Design: A Handbook of Black Magic"。 作者是Howard Johnson和Martin Graham。这是一本关于高速数字电路设计的优秀教材&#xff0c;适合那些需要设计高速电路的工程师。 作为比较早出来的信号完整性参考书&#xff0c;对国内的信号完整性研…

Apollo与SpringBoot整合原理深度剖析

Apollo与SpringBoot整合原理深度剖析 Spring环境上下文模块Value注解如何完成属性注入application.yml等配置文件加载时机监听环境上下文prepared事件Loader加载配置文件 Apollo与SpringBoot整合原理Value注解的热更新原理 Spring环境上下文模块 Spring Envionment设计如下: 需…

Unlimiformer:一个Transformers输入无限长文本思路和中文长文本摘要上的性能实验

Unlimiformer&#xff1a;一个Transformers输入无限长文本思路和中文长文本摘要上的性能实验 1、前言 在处理长文本输入时&#xff0c;以往方法常采用截断&#xff08;如&#xff1a;max_len512&#xff09;、分块&#xff08;将输入分成多个块&#xff0c;并进行逐块处理&am…

【EasyPoi实战系列】Spring Boot使用EasyPoi实现多Sheet导出 - 第470篇

悟纤&#xff1a;师傅&#xff0c;那个讨人厌的产品又来捣乱了~ &#x1f612; 师傅&#xff1a;哈哈&#xff0c;你又来抱怨老板设定的无休止需求了啊&#xff1f; &#x1f606; 悟纤&#xff1a;没错&#xff0c;这次竟然要求导出多个Sheet&#xff0c;这还能不能好好地活着…

十九、Sleuth整合Zipkin链路跟踪

目录 链路跟踪概述 SpringCloud Sleuth 1、架构图 2、主要概念 2.1、跟踪&#xff1a;Trace (一条完整链路--包含很多span(微服务接口)) 2.2、跨度&#xff1a;Span 2.3、标注&#xff1a;Annotation Sleuth整合Zipkin实现分布式链路跟踪 1、搭建zipkin环境 1.1、下载…

2023年5月中国数据库排行榜:OTO组合回归育新机,华为高斯蓄势待发展雄心

路漫漫其修远兮&#xff0c;吾将上下而求索。 2023年5月的 墨天轮中国数据库流行度排行 火热出炉&#xff0c;本月共有262个数据库参与排名。本月排行榜前十变动较大&#xff0c;可以用一句话概括为&#xff1a;openGauss 立足创新夺探花&#xff1b;华为云GaussDB 云上之争成赢…

单片机设计_室内环境智能监测系统(STM32 OLED ESP8266 DHT11 MQ-2 加湿器)

想要更多项目私wo!!! 一、电路设计 室内环境智能监测系统 主要功能: 1.检测空气温湿度 2.检测光照强度 3.检测烟雾浓度 4.数据显示在手机端和设备OLED屏幕上 5.当空气温度高于设定的阈值时&#xff0c;风扇开启 6.当空气湿度…

【Linux从入门到精通】上下文概念详解

上篇文章&#xff08;进程的基本概念&#xff09;我们讲解了进程后&#xff0c;还留下了一个上下文数据概念还没有解释。本篇文章会对上下文概念进行详解。在理解上下文概念时&#xff0c;同时会引出很多新的概念。我们都会对此进行详细解释&#xff0c;希望本篇文章会对你有所…

7款产品经理必备的交互软件

作为UI/UX设计师&#xff0c;我相信你或多或少接触过很多交互设计软件。 为您整理总结了几款流行的交互软件。如果您在上述交互设计软件中确实存在选择困难&#xff0c;希望通过阅读本文帮助您快速做出正确的选择。 即时设计 即时设计是一款「专业UI设计工具」&#xff0c;不…

redis从零开始(1)----基本类型:string/hash/list

认识redis NoSQL Nosql not only sql&#xff0c;泛指非关系型数据库&#xff0c;与之相对的是RDBMS(Relational Database Management System)&#xff0c;即关系型数据库 关系型数据库&#xff1a;列行&#xff0c;同一个表下数据的结构是一样的。 非关系型数据库&#xff…

企业有必要对三方应用进行安全管控吗?

什么是三方应用&#xff1f; 三方应用是指由第三方开发者创建的软件应用程序&#xff0c;与操作系统或其他主要平台的开发公司无关。这些应用程序通常被设计为在特定平台上运行&#xff0c;并且具有特定的功能或服务&#xff0c;例如社交媒体应用程序、游戏和生产力工具等。 简…

IntersectionObserver“替代”滚动条监听

概要 IntersectionObserver 接口提供了一种异步观察目标元素与其祖先元素或顶级文档视口&#xff08;viewport&#xff09;交叉状态的方法。其祖先元素或视口被称为根&#xff08;root&#xff09;。 当一个 IntersectionObserver 对象被创建时&#xff0c;其被配置为监听根中…

Blender渲染分辨率如何优化设置?这些渲染技巧你要知道!

尽管 Blender不断改进其功能&#xff0c;随着硬件的不断进步而变得越来越复杂&#xff0c;该软件最好的是允许很多人免费试用它。但即使所有人都可以访问&#xff0c;这并不意味着Blender可以克服低端GPU的局限性。 并非所有PC都是平等的&#xff0c;也不是每个3D设计师都可以使…

Aho-Corasick automaton,ac自动机实现

文章目录 写在前面算法概述trie树的构建trie树的节点结构插入P串到trie树中fail指针的创建 搜索过程测试程序 写在前面 原作者的视频讲解链接&#xff1a;[算法]轻松掌握ac自动机_哔哩哔哩_bilibili 原作者的代码实现&#xff1a;data-structure-and-algorithm/aho_corasick.c…

机器视觉表面划痕检测流程

表面缺陷检测常见的检测主要有物体表面的划痕、污渍、缺口、平面度、破损、边框对齐度、物体表面的亮度、皱纹、斑点、孔等。 表面缺陷检测设备凝聚了机器视觉领域的许多技术成果&#xff0c;吸取了许多创新的检测理念&#xff0c;可以与现有生产线无缝对接检测&#xff0c;也…

制定进度计划是成功项目管理的必由之路

项目经理王斌接到一个新项目&#xff0c;与各项目干系人没有建立有效的联系&#xff0c;他们无法了解项目进展情况。甚至连项目团队的参与人员自身对项目整体情况也没有清楚的认识&#xff0c;而只管自己那一部分&#xff0c;整个开发过程完全是一种黑盒模式&#xff0c;项目组…

电视盒子哪个好?内行盘点2023最具性价比电视盒子推荐

电视盒子跟有线机顶盒相比不用每年缴费&#xff0c;资源也更丰富&#xff0c;可下载各种APP。作为电视盒子从业人员&#xff0c;身边亲友在选购电视盒子之前会咨询我的意见&#xff0c;不懂电视盒子哪个好&#xff0c;可以看看我总结的2023最具性价比电视盒子推荐&#xff0c;非…

手慢无,阿里巴巴最新出品的高并发终极笔记到底有多强?

前几天收到一位粉丝私信&#xff0c;说的是他才一年半经验&#xff0c;去面试却被各种问到分布式&#xff0c;高并发&#xff0c;多线程之间的问题。基础层面上的是可以答上来&#xff0c;但是面试官深问的话就不会了&#xff01;被问得都怀疑现在Java招聘初级岗位到底招的是初…