寒假集训01day

文章讨论了两道蓝桥杯竞赛题目:飞机降落调度问题(利用DFS解决冲突)和接龙数列构造(寻找最少删除数),涉及编程技巧和策略分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题目链接

[蓝桥杯 2023 省 B] 飞机降落

题目描述

N N N 架飞机准备降落到某个只有一条跑道的机场。其中第 i i i 架飞机在 T i T_{i} Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 D i D_{i} Di 个单位时间,即它最早可以于 T i T_{i} Ti 时刻开始降落,最晩可以于 T i + D i T_{i}+D_{i} Ti+Di 时刻开始降落。降落过程需要 L i L_{i} Li 个单位时间。

一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。

请你判断 N N N 架飞机是否可以全部安全降落。

输入格式

输入包含多组数据。

第一行包含一个整数 T T T,代表测试数据的组数。

对于每组数据,第一行包含一个整数 N N N

以下 N N N 行,每行包含三个整数 T i , D i , L i T_{i},D_{i},L_{i} Ti,Di,Li

输出格式

对于每组数据,输出 YES 或者 NO,代表是否可以全部安全降落。

样例 #1

样例输入 #1

2
3
0 100 10
10 10 10
0 2 20
3
0 10 20
10 10 20
20 10 20

样例输出 #1

YES
NO

提示

【样例说明】

对于第一组数据,可以安排第 3 架飞机于 0 时刻开始降落,20 时刻完成降落。安排第 2 架飞机于 20 时刻开始降落,30 时刻完成降落。安排第 1 架飞机于 30 时刻开始降落,40 时刻完成降落。

对于第二组数据,无论如何安排,都会有飞机不能及时降落。

【评测用例规模与约定】

对于 30 % 30 \% 30% 的数据, N ≤ 2 N \leq 2 N2

对于 100 % 100 \% 100% 的数据, 1 ≤ T ≤ 10 1 \leq T \leq 10 1T10 1 ≤ N ≤ 10 1 \leq N \leq 10 1N10 0 ≤ T i , D i , L i ≤ 1 0 5 0 \leq T_{i},D_{i},L_{i} \leq 10^{5} 0Ti,Di,Li105

蓝桥杯 2023 省赛 B 组 D 题。

思路总结:
这题数据很弱,我们完全可以考虑直接暴力。

对于dfs的time,我们有两种情况,第一:直接从当前时间出发;第二:从当前飞机的起飞时间出发,因为当当前时间小于起飞时间的时候,我们并不能进行起飞,需要进行等待。

#include<bits/stdc++.h>
using namespace std;
struct Point{
	int t,d,l;
}p[15];
int b[15];
int n,pr,maxn;

bool cmp(Point a,Point b){
	if(a.t!=b.t) return a.t<b.t;
} 
void dfs(int x,int time){
	if(x==n){
		pr=1;
		return;
	}
	for(int i=1;i<=n;i++){
		int ttime;
		if(time<p[i].t) ttime = p[i].t;
		else 			ttime = time;
		if(b[i]==0 && ttime>=p[i].t && ttime<=p[i].d+p[i].t){
			b[i]=1;
			dfs(x+1,ttime+p[i].l);
			b[i]=0;
		}
	}
}
void slove(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>p[i].t>>p[i].d>>p[i].l;
		maxn=max(maxn,p[i].t+p[i].d+p[i].l);
	}
	memset(b,0,sizeof(b));
	pr=0;
	sort(p+1,p+n+1,cmp);
	dfs(0,0);
	if(pr==1){
		cout<<"YES"<<endl;
	} 
	else{
		cout<<"NO"<<endl;
	}
}
int main(){
	int t;
	cin>>t;
	while(t--){
		slove();
	}
	return 0;
} 

题目链接

[蓝桥杯 2023 省 B] 接龙数列

题目描述

对于一个长度为 K K K 的整数数列: A 1 , A 2 , … , A K A_{1},A_{2},\ldots,A_{K} A1,A2,,AK,我们称之为接龙数列当且仅当 A i A_{i} Ai 的首位数字恰好等于 A i − 1 A_{i-1} Ai1 的末位数字( 2 ≤ i ≤ K 2 \leq i \leq K 2iK)。

例如 12 , 23 , 35 , 56 , 61 , 11 12,23,35,56,61,11 12,23,35,56,61,11 是接龙数列; 12 , 23 , 34 , 56 12,23,34,56 12,23,34,56 不是接龙数列,因为 56 56 56 的首位数字不等于 34 34 34 的末位数字。所有长度为 1 1 1 的整数数列都是接龙数列。

现在给定一个长度为 N N N 的数列 A 1 , A 2 , … , A N A_{1},A_{2},\ldots,A_{N} A1,A2,,AN,请你计算最少从中删除多少 个数,可以使剩下的序列是接龙序列?

输入格式

第一行包含一个整数 N N N

第二行包含 N N N 个整数 A 1 , A 2 , … , A N A_{1},A_{2},\ldots,A_{N} A1,A2,,AN

输出格式

一个整数代表答案。

样例 #1

样例输入 #1

5
11 121 22 12 2023

样例输出 #1

1

提示

【样例说明】

删除 22 22 22,剩余 11 , 121 , 12 , 2023 11,121,12,2023 11,121,12,2023 是接龙数列。

【评测用例规模与约定】

对于 20 % 20 \% 20% 的数据, 1 ≤ N ≤ 20 1 \leq N \leq 20 1N20

对于 50 % 50 \% 50% 的数据, 1 ≤ N ≤ 1 0 4 1 \leq N \leq 10^4 1N104

对于 100 % 100 \% 100% 的数据, 1 ≤ N ≤ 1 0 5 1 \leq N \leq 10^{5} 1N105 1 ≤ A i ≤ 1 0 9 1 \leq A_{i} \leq 10^{9} 1Ai109。所有 A i A_{i} Ai 保证不包含前导 0。

蓝桥杯 2023 省赛 B 组 E 题。

思路总结:
这个题要求的是最少删除的个数,但我们可以逆向思考,求最长的接龙序列,然后再求删除了多少个数字。

我们可以考虑用dp来做。

第一种思想便是求最长子序列的思想,O(n^2)

dp[i]放映的是前i个数的最大接龙序列
for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++){
            //这里判断是否能连成接龙序列
			if(sum[j].e==sum[i].s && i!=j){
				dp[i] = max(dp[i],dp[j]+1);
				maxn = max(maxn,dp[i]);
			}
		}
	}

第二种思想:

我们令dp[i]表示的是以i结尾的最大长度,那么对于一个新的整数来说,无非就是考虑他是否使用。

若使用,便是dp[sum[i].s]+1.

不使用则不改变。

那么状态状态转移方程便是:

dp[sum[i].e] = max(dp[sum[i].s]+1,dp[sum[i].e]); 
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
//dp
struct Sum{
	int s,e;
}sum[N];
//dp[i]反应的是以i结尾的最大长度 ji
int dp[15],maxn;
void cel(int i,int t){
	sum[i].e=t%10;
	while(t){
		if(t/10==0)
		sum[i].s=t;
		t/=10;
	}
}
int main(){
	int n;
	cin>>n;
	for(int i=1,t;i<=n;i++){
		cin>>t;
		cel(i,t);
	}
	for(int i=1;i<=n;i++){
		dp[sum[i].e] = max(dp[sum[i].s]+1,dp[sum[i].e]); 
	}
	for(int i=0;i<=10;i++){
		maxn = max(maxn,dp[i]);
	}
	cout<<n-maxn;
	return 0;
} 

题目链接

[蓝桥杯 2023 省 A] 平方差

题目描述

给定 L , R L,R L,R,问 L ≤ x ≤ R L \leq x \leq R LxR 中有多少个数 x x x 满足存在整数 y , z y,z y,z 使得 x = y 2 − z 2 x=y^2-z^2 x=y2z2

输入格式

输入一行包含两个整数 L , R L,R L,R,用一个空格分隔。

输出格式

输出一行包含一个整数满足题目给定条件的 x x x 的数量。

样例 #1

样例输入 #1

1 5

样例输出 #1

4

提示

【样例说明】
  • 1 = 1 2 − 0 2 1=1^2-0^2 1=1202
  • 3 = 2 2 − 1 2 3=2^2-1^2 3=2212
  • 4 = 2 2 − 0 2 4=2^2-0^2 4=2202
  • 5 = 3 2 − 2 2 5=3^2-2^2 5=3222
【评测用例规模与约定】

对于 40 % 40 \% 40% 的评测用例, L , R ≤ 5000 L,R \leq 5000 L,R5000

对于所有评测用例, 1 ≤ L ≤ R ≤ 1 0 9 1 \leq L \leq R \leq 10^9 1LR109

第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组 C

思路总结:
x = (y-z)(y+z)可以理解为两个因子和为偶数,那么奇数便一定可以,因为可以拆成1加上其本身。我们再看偶数,偶数x可以拆成2K,那么当x是4的倍数时一定成立,由此可推当x是奇数和4的倍数的时候一定成立。

那么就是每4个为一个周期,4n+1(成立),4n+2(不成立),4n+3(成立),4n+4(成立)

#include<bits/stdc++.h>
using namespace std;
const int N = 1e9+10;
int sum[2],a,b;
// (x+y)*(x-y)
//两个因数和为偶数
//那么奇数一定可以 
int cel(int x){
	int t=0;
	if(x%4==1)
	t=1;
	else if(x%4==2)
	t=1;
	else if(x%4==3)
	t=2;
	return x/4*3+t;
}
int main(){
	int n,m;
	cin>>n>>m;
	cout<<cel(m)-cel(n-1);
	return 0;
}
//1 2 3 4 3个可以 
//5 6 7 8 3个可以 

为了在Windows安装ADB工具,你可以按照以下步骤进行操作: 1. 首先,下载ADB工具包并解压缩到你自定义的安装目录。你可以选择将其解压缩到任何你喜欢的位置。 2. 打开运行窗口,可以通过按下Win+R键来快速打开。在运行窗口中输入"sysdm.cpl"并按下回车键。 3. 在系统属性窗口中,选择"高级"选项卡,然后点击"环境变量"按钮。 4. 在环境变量窗口中,选择"系统变量"部分,并找到名为"Path"的变量。点击"编辑"按钮。 5. 在编辑环境变量窗口中,点击"新建"按钮,并将ADB工具的安装路径添加到新建的路径中。确保路径正确无误后,点击"确定"按钮。 6. 返回到桌面,打开命令提示符窗口。你可以通过按下Win+R键,然后输入"cmd"并按下回车键来快速打开命令提示符窗口。 7. 在命令提示符窗口中,输入"adb version"命令来验证ADB工具是否成功安装。如果显示版本信息,则表示安装成功。 这样,你就成功在Windows安装ADB工具。你可以使用ADB工具来执行各种操作,如枚举设备、进入/退出ADB终端、文件传输、运行命令、查看系统日志等。具体的操作方法可以参考ADB工具的官方文档或其他相关教程。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [windows环境安装adb驱动](https://blog.youkuaiyun.com/zx54633089/article/details/128533343)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Windows安装使用ADB简单易懂教程](https://blog.youkuaiyun.com/m0_37777700/article/details/129836351)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值