【三】【算法】P1007 独木桥,P1012 [NOIP1998 提高组] 拼数,P1019 [NOIP2000 提高组] 单词接龙

news2024/11/27 21:01:35

P1007 独木桥

独木桥

题目背景

战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们。士兵们十分愤怒,因为这座独木桥十分狭窄,只能容纳 1 1 1 个人通过。假如有 2 2 2 个人相向而行在桥上相遇,那么他们 2 2 2 个人将无法绕过对方,只能有 1 1 1 个人回头下桥,让另一个人先通过。但是,可以有多个人同时呆在同一个位置。

题目描述

突然,你收到从指挥部发来的信息,敌军的轰炸机正朝着你所在的独木桥飞来!为了安全,你的部队必须撤下独木桥。独木桥的长度为 L L L,士兵们只能呆在坐标为整数的地方。所有士兵的速度都为 1 1 1,但一个士兵某一时刻来到了坐标为 0 0 0 L + 1 L+1 L+1 的位置,他就离开了独木桥。

每个士兵都有一个初始面对的方向,他们会以匀速朝着这个方向行走,中途不会自己改变方向。但是,如果两个士兵面对面相遇,他们无法彼此通过对方,于是就分别转身,继续行走。转身不需要任何的时间。

由于先前的愤怒,你已不能控制你的士兵。甚至,你连每个士兵初始面对的方向都不知道。因此,你想要知道你的部队最少需要多少时间就可能全部撤离独木桥。另外,总部也在安排阻拦敌人的进攻,因此你还需要知道你的部队最多需要多少时间才能全部撤离独木桥。

输入格式

第一行共一个整数 L L L,表示独木桥的长度。桥上的坐标为 1 , 2 , ⋯   , L 1, 2, \cdots, L 1,2,,L

第二行共一个整数 N N N,表示初始时留在桥上的士兵数目。

第三行共有 N N N 个整数,分别表示每个士兵的初始坐标。

输出格式

共一行,输出 2 2 2 个整数,分别表示部队撤离独木桥的最小时间和最大时间。 2 2 2 个整数由一个空格符分开。

样例 #1

样例输入 #1

4 2 1 3

样例输出 #1

2 4

提示

对于 100 % 100\% 100% 的数据,满足初始时,没有两个士兵同在一个坐标, 1 ≤ L ≤ 5 × 1 0 3 1\le L\le5\times 10^3 1L5×103 0 ≤ N ≤ 5 × 1 0 3 0\le N\le5\times10^3 0N5×103,且数据保证 N ≤ L N\le L NL

代码

#include<bits/stdc++.h>
using namespace std;
int main() {
	int L, N;
	cin >> L >> N;
	int min_time = 0, max_time = 0;

	for (int i = 0; i < N; i++) {
		int pos; cin >> pos;
		int time1 = pos; int time2 = L + 1 - pos;
		min_time=max(min(time1, time2),min_time);
		max_time=max(max(time1, time2),max_time);

	}

	cout << min_time << " " << max_time << endl;
}
  • 思路
    每一个士兵地位是相等的,他们每一个人没有本质的区别,可以想象当两个士兵迎面对撞时,他们各自都要掉头前进,而他们地位相同,可以理解为士兵没有掉头,而是直接穿越过去,犹如一个幽灵体,无视体积碰撞,因此对于每一个士兵,都可以依靠他所在的位置计算出他所需要花费的最大时间和最小时间.
  • 目标
    我们需要计算花费的最小时间和花费的最大时间,所有士兵是一起行动的,并且处于幽灵体无视体积碰撞,花费的最小时间取决于所有士兵的花费最小时间中花费的最大时间,花费最大时间取决于所有士兵的花费最大时间中花费的最大时间.
    听起来有一点绕口,我们可以用一张图进行解释.
    在这里插入图片描述
  • 转换
    问题被转化为求一组最小值数据中最大值和一组最大值数据中最大值.

P1012 [NOIP1998 提高组] 拼数

[NOIP1998 提高组] 拼数

题目描述

设有 n n n 个正整数 a 1 … a n a_1 \dots a_n a1an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。

输入格式

第一行有一个整数,表示数字个数 n n n

第二行有 n n n 个整数,表示给出的 n n n 个整数 a i a_i ai

输出格式

一个正整数,表示最大的整数

样例 #1

样例输入 #1

3 13 312 343

样例输出 #1

34331213

样例 #2

样例输入 #2

4 7 13 4 246

样例输出 #2

7424613

提示

对于全部的测试点,保证 1 ≤ n ≤ 20 1 \leq n \leq 20 1n20 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109

NOIP1998 提高组 第二题

代码

#include<bits/stdc++.h>
using namespace std;
#if 1
bool com(int a, int b) {

	int tmpa = a, tmpb = b;
	int lenA = 1, lenB = 1;
	while (tmpa /= 10) lenA++;
	while (tmpb /= 10) lenB++;

	tmpa = a; tmpb = b;
	while (1) {

		int topA = tmpa / (int)pow(10, lenA - 1);
		int topB = tmpb / (int)pow(10, lenB - 1);

		if (topA > topB) return true; 
		if (topA < topB) return false; 

		
		lenA--;
		lenB--;

		if (lenA == 0 && lenB == 0) break; 
	}

	return false; 
}
#endif
#if 0
bool com(int a, int b) {
	string stra = to_string(a);
	string strb = to_string(b);
	return stra + strb > strb + stra;
}
#endif
int  main() {
	int n; cin >> n;
	vector<int>a;
	for (int i = 0; i < n; i++) {
		int nums; cin >> nums;
		a.push_back(nums);
	}
	sort(a.begin(), a.end(), com);
	for (auto x : a) {
		cout << x;
	}
	cout << endl;

}
  • 思路
    字符串判断大小是怎么判断的?先判断两个字符串的第一个字符大小,哪个字符大,哪个字符串就大,如果相同就判断第二个字符大小,依次类推.
    这道题目需要我们判断数字的大小,并且按照这种字符串的判断方式去判断.一开始我想通过一个函数去判断数字大小,但是这种代码有些用例时间复杂度过不去.因此我们可以利用内置的string判断大小方式去判断数字,只需要把数字转化为字符串即可.

P1019 [NOIP2000 提高组] 单词接龙

[NOIP2000 提高组] 单词接龙

题目背景

注意:本题为上古 NOIP 原题,不保证存在靠谱的做法能通过该数据范围下的所有数据。

本题为搜索题,本题不接受 hack 数据。关于此类题目的详细内容

NOIP2000 提高组 T3

题目描述

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beastastonish,如果接成一条龙则变为 beastonish,另外相邻的两部分不能存在包含关系,例如 atatide 间不能相连。

输入格式

输入的第一行为一个单独的整数 n n n 表示单词数,以下 n n n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在。

输出格式

只需输出以此字母开头的最长的“龙”的长度。

样例 #1

样例输入 #1

5 at touch cheat choose tact a

样例输出 #1

23

提示

样例解释:连成的“龙”为 atoucheatactactouchoose

n ≤ 20 n \le 20 n20

代码

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

#if 1
int n;
char start;
vector<string> a;
vector<int> used;
int ret = 0;

int f(string str1, string str2) {
	for (int i = 1; i <= min(str1.size(), str2.size()); i++) {
		bool flag = true;
		for (int j = 0; j < i; j++) {
			if (str1[str1.size() - i + j] != str2[j]) {
				flag = false;
				break;
			}
		}
		if (flag) return i;
	}
	return 0;
}

void dfs(string str_now) {
	ret = max(ret, (int)str_now.size());
	for (int i = 0; i < a.size(); i++) {
		if (used[i] >= 2) continue;
		int c = f(str_now, a[i]);
		if (c > 0) {
			used[i]++;
			dfs(str_now + a[i].substr(c));
			used[i]--;
		}
	}
}

int main() {
	cin >> n;
	a.resize(n);
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	cin >> start;

	used.resize(n, 0);


	for (int i = 0; i < n; i++) {
		if (a[i][0] == start) {
			used[i]++;
			dfs(a[i]);
			used[i]--;
		}
	}

	cout << ret << endl;
}
#endif

  • 思路
    暴力递归求解,我们首先有许多个字符串,对于每一个字符串我们最多使用两次,那么我们用一个used数组记录所有的字符串使用的次数情况,接着是start字符,是我们的龙头.
    我们递归每一种情况,对于每一种情况得到的龙的长度记录,求这些长度的最大值.
  • 递归含义
    dfs递归的含义是当前节点所拼接的字符串是str_now,然后遍历我们拥有的字符串,需要满足两个条件就可以拼接,第一个条件是字符串使用次数没有超过两次,第二个条件是可以拼接.
  • 拼接判断
    是否可以拼接我们可以写一个函数进行判断,f函数的含义就是判断str1,str2是否满足拼接条件.
  • f函数解释
int f(string str1, string str2) {
    // 遍历从1到最小字符串长度的所有可能的重叠长度
    for (int i = 1; i <= min(str1.size(), str2.size()); i++) {
        bool flag = true;
        // 检查两个字符串是否有长度为i的相同部分
        for (int j = 0; j < i; j++) {
            // str1的后i个字符是否和str2的前i个字符相同
            if (str1[str1.size() - i + j] != str2[j]) {
                // 如果不相同,重置flag为false并跳出循环
                flag = false;
                break;
            }
        }
        // 如果找到了一个长度为i的相同部分,则返回该长度
        if (flag) return i;
    }
    // 如果没有找到任何重叠部分,返回0
    return 0;
}

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

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

相关文章

H3C GRE VPN基本配置实验

H3C GRE VPN基本配置实验 实验拓扑 ​​ 实验需求 按照图示配置 IP 地址在 R1 和 R3 上配置默认路由使公网区域互通在 R1 和 R3 上配置 GRE VPN&#xff0c;使两端私网能够互相访问&#xff0c;Tunnel 口 IP 地址如图在 R1 和 R3 上配置动态路由协议来传递两端私网路由 实…

盘点2024年双十一最值得入手的好物,双十一必买清单大汇总

随着科技的飞速发展&#xff0c;数码产品已成为我们生活中不可或缺的伙伴。2024年双十一购物狂欢节即将来临&#xff0c;众多消费者早已摩拳擦掌&#xff0c;准备在这个年度盛事中淘到心仪的数码好物。在这个信息爆炸的时代&#xff0c;如何从琳琅满目的商品中挑选出性价比高、…

项目管理系统介绍,核心概念与操作技巧

项目管理系统通过分解任务、管理工时、规划项目等提升效率&#xff0c;支持多种使用场景&#xff0c;具备高度可定制性&#xff0c;适合不同用户群体&#xff0c;注重数据安全&#xff0c;能与其他软件集成。ZohoProjects因全面功能、低价和友好界面受中小企业青睐。 一、项目管…

视频背景音乐怎么提取出来?音乐爱好者必看:视频音轨提取指南

在数字媒体时代&#xff0c;视频成为了一种非常流行的信息传播方式。有时候&#xff0c;我们在观看视频时会被其中的背景音乐所吸引&#xff0c;想要将其提取出来单独欣赏或用于其他用途。那么&#xff0c;视频背景音乐怎么提取出来呢&#xff1f;本文将为您详细介绍几种提取视…

【Windows】【DevOps】Windows Server 2022平台启用WinRM实现远程powershell登陆 采用自签名证书开启HTTPS方案

快速配置开启WinRM(HTTP) quiciconfig 在目标服务器上&#xff0c;管理员权限启动powershell&#xff0c;执行指令 winrm quickconfig 输入y&#xff0c;完整日志如下 PS C:\Windows\system32> winrm quickconfig 已在此计算机上运行 WinRM 服务。 WinRM 没有设置成为了…

探索SAM:介绍、应用与衍生方向

Segment Anything Model&#xff08;简称SAM&#xff09;是Facebook Research团队开发的一项先进的图像分割技术。它通过使用深度学习模型&#xff0c;能够识别并分割出图像中的各个物体。SAM的创新之处在于其能够通过不同的交互方式&#xff08;如鼠标悬停、点击、框选和全图分…

pyQT生成界面,更改后不清除自定义代码的方法

基本原理就是作个子类继承生成的界面&#xff0c;在子类里写代码 工程结构 dialog_ui.py 界面子类 from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtGui import QStandardItemModel, QStandardItem, QColor, QFont from PyQt5.QtCore import Qt import Ui_dialog i…

带隙基准Bandgap电路学习(一)

一、原理图 Bandgap中的运放&#xff08;折叠式Cascode&#xff09;采用P输入对&#xff0c;是因为运放输入端接的PNP三极管发射极端的电位&#xff0c;电压小&#xff0c;为了确保输入对管能够饱和工作&#xff0c;故采用P输入对管。此外&#xff0c;P管作为输入管&#xff0c…

UE5.3.2查看引擎真正版本

编译好的插件给别人用&#xff0c;发现引擎不一致&#xff0c;而且双方都是5.3.2版本引擎 打开Help->About Unreal Editor可以看到引擎版本 或者直接查看引擎版本文件&#xff1a;XXXXX\Engine\Build\Build.version 里面能看到对应的分支名字

【AIGC】OpenAI Canvas发布,代码能力秒杀Copilot,360°碾压Claude

目录 在Canvas界面中&#xff0c;你可以&#xff1a;Canvas有哪些强大功能&#xff1f;写作助手的升级编程功能的提升 网友反响如何&#xff1f;[如何直接使用ChatGPT4o、o1、OpenAI Canvas](https://www.nezhasoft.cn/) 10月3日凌晨1点、太平洋时间的上午 10 点&#xff0c;Op…

RK3568平台(平台总线篇)IIC光感BH1721模块调试

一.BH1721硬件信息 总上,读取数据全过程为: 通过查看数据手册得知BH1721的设备地址为0x23,光感并不是直接去读取设备地址上某个寄存器的地址,而是通过向0x23直接写入数据0x01 0x10后直接读取光感值。 第一步:通过I2C总线,主机给bh1721设备发送数据:0x01 ——> (Pow…

PyQt5 布局管理、事件、信号以及对话框

布局管理 绝对定位 每个程序都是以像素为单位区分元素的位置&#xff0c;衡量元素的⼤⼩。所以我们完全可以使⽤绝对定位搞定每个元素和窗⼜的位置。 局限性&#xff1a; 元素不会随着我们更改窗⼜的位置和⼤⼩⽽变化不能适⽤于不同的平台和不同分辨率的显⽰器更改应⽤字体…

老板的“神助攻”:公司电脑监控软件

在当今的商业世界中&#xff0c;企业管理者都希望员工能全身心投入工作&#xff0c;为企业创造更多价值。然而&#xff0c;员工上班摸鱼的现象却让许多老板头疼不已。公司电脑监控软件的出现&#xff0c;为解决这一问题提供了可能。接下来&#xff0c;我们将详细介绍几款优质的…

新160个crackme - 079-DueList.5

运行分析 提示需要注册 PE分析 32位程序&#xff0c;PE Diminisher壳 手动脱壳 x32dbg打开程序&#xff0c;按一下F8&#xff0c;根据ESP定律&#xff0c;在此处下断点按一下F9&#xff0c;两下F8&#xff0c;来到OEP处00401000打开Scylla&#xff0c;点击转储保存文件点击IAT自…

深入理解Dubbo源码核心原理-Part3

到此开始讲解Dubbo消费端的源码 在消费一端&#xff0c;需要关注两件事情。第一&#xff0c;接口的proxy如何生成。第二&#xff0c;请求如何发送。 首先看到启动类 接下来看真正inject方法 现在需要思考&#xff0c;待注入的Bean从哪儿来&#xff0c;这个Bean必然注入的是一…

Basic penetration_1靶机渗透

项目地址 plain https://download.vulnhub.com/basicpentesting/basic_pentesting_1.ova 实验过程 开启靶机虚拟机 ![](https://img-blog.csdnimg.cn/img_convert/4135d3c176bdca1f661f756b8321c97a.png) 使用nmap进行主机发现&#xff0c;获取靶机IP地址 plain nmap 192.1…

如何删除不需要的右键菜单

比如要删除以下右键菜单&#xff1a; 1. 打开“命令提示符”&#xff0c;并输入“regedit”以打开注册表编辑器。或使用快捷键“WinR”打开“运行”窗口&#xff0c;输入“regedit”以打开注册表编辑器。 2. 在注册表编辑器中&#xff0c;找到路径“计算机HKEY_CLASSES_ROOT/Di…

IterComp: 从模型图库中迭代合成感知反馈学习,用于文本到图像的生成

我们从多个模型中收集组成感知模型偏好&#xff0c;并采用迭代反馈学习方法&#xff0c;使基础扩散模型和奖励模型都能逐步自我完善。 我们提出了一种迭代反馈学习方法&#xff0c;通过多次迭代&#xff0c;使基础扩散模型和奖励模型逐步自我完善&#xff0c;从而以闭环方式增…

智能化叉车作业安全高效监控管理系统方案

在物流作业中&#xff0c;智能叉车管理系统的引入&#xff0c;不仅极大地提升了作业效率&#xff0c;还显著增强了作业安全性&#xff0c;为物流行业的现代化转型注入了强劲动力。 1、产品简介 2023A智能叉车管理系统是用于工业车辆安全监控管理的车载终端&#xff0c;具有快…

1.4 使用Vite创建Vue 3项目

文章目录 什么是 ViteVite 的优点注意事项 创建 Vue 3 项目手动创建项目通过模板自动创建项目启动项目 Vue 3 项目目录结构Vue 3 项目运行过程项目运行过程项目关键文件 大家好&#xff0c;今天我们将一起学习如何使用 Vite 创建一个 Vue 3 项目。Vite 是一个现代的前端构建工具…