题目链接
[蓝桥杯 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 N≤2。
对于 100 % 100 \% 100% 的数据, 1 ≤ T ≤ 10 1 \leq T \leq 10 1≤T≤10, 1 ≤ N ≤ 10 1 \leq N \leq 10 1≤N≤10, 0 ≤ T i , D i , L i ≤ 1 0 5 0 \leq T_{i},D_{i},L_{i} \leq 10^{5} 0≤Ti,Di,Li≤105。
蓝桥杯 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} Ai−1 的末位数字( 2 ≤ i ≤ K 2 \leq i \leq K 2≤i≤K)。
例如 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 1≤N≤20。
对于 50 % 50 \% 50% 的数据, 1 ≤ N ≤ 1 0 4 1 \leq N \leq 10^4 1≤N≤104。
对于 100 % 100 \% 100% 的数据, 1 ≤ N ≤ 1 0 5 1 \leq N \leq 10^{5} 1≤N≤105, 1 ≤ A i ≤ 1 0 9 1 \leq A_{i} \leq 10^{9} 1≤Ai≤109。所有 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 L≤x≤R 中有多少个数 x x x 满足存在整数 y , z y,z y,z 使得 x = y 2 − z 2 x=y^2-z^2 x=y2−z2。
输入格式
输入一行包含两个整数 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=12−02
- 3 = 2 2 − 1 2 3=2^2-1^2 3=22−12
- 4 = 2 2 − 0 2 4=2^2-0^2 4=22−02
- 5 = 3 2 − 2 2 5=3^2-2^2 5=32−22
【评测用例规模与约定】
对于 40 % 40 \% 40% 的评测用例, L , R ≤ 5000 L,R \leq 5000 L,R≤5000;
对于所有评测用例, 1 ≤ L ≤ R ≤ 1 0 9 1 \leq L \leq R \leq 10^9 1≤L≤R≤109。
第十四届蓝桥杯大赛软件赛省赛 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个可以