【2023蓝桥真题】C++ C组题解
温馨提示:这篇文章已超过387天没有更新,请注意相关的内容是否还可用!
好了,我们开始
目录
飞机降落
岛屿个数
接龙数列
子串简写
日期统计
整数删除
飞机降落
N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,即它最早
可以于 Ti 时刻开始降落,最晚可以于 Ti + Di 时刻开始降落。降落过程需要 Li个单位时间。
一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。
请你判断 N 架飞机是否可以全部安全降落。
输入格式:
输入包含多组数据。
第一行包含一个整数 T,代表测试数据的组数。
对于每组数据,第一行包含一个整数 N。
以下 N 行,每行包含三个整数:Ti,Di 和 Li。
2 3 0 100 10 10 10 10 0 2 20 3 0 10 20 10 10 20 20 10 20
输出格式:
对于每组数据,输出 YES 或者 NO,代表是否可以全部安全降落。
YES NO
提示:
对于第一组数据,可以安排第 3 架飞机于 0 时刻开始降落,20 时刻完成降落。安排第 2 架飞机于 20 时刻开始降落,30 时刻完成降落。安排第 1 架飞机于 30 时刻开始降落,40 时刻完成降落。
对于第二组数据,无论如何安排,都会有飞机不能及时降落。
对于 30% 的数据,N ≤ 2。
对于 100% 的数据,1 ≤ T ≤ 10,1 ≤ N ≤ 10,0 ≤ Ti , Di , Li ≤ 105。
思路:
我们只需模拟下去就行,首先你会看到dfs中我有n个分支,这里就是取最佳能降落的飞机过程,然后让他降落,如果这个决策在后面发现是错误的,那就回溯,重新进行这个决策即可,不断重复直到把所有飞机降落完成就行了。
细节:
首先就是我写的这个bool dfs函数有个特点,就是只要找到答案就会立刻结束整个dfs过程,那么我们当然希望它能够今早的找到答案了,这样能加节约时间,所以我对plane进行了排序,以便每次都能尽量选取正确的决策。
然后就行说一下我当时做这个题遇到的一个坑:那就是下个过来的飞机可能会很晚,因此这种情况下应该上个飞机降落后时间应该再推迟一下,才能赶上下一个新来的飞机,所以我用了max函数。
*/
#include //飞机降落:每架飞机到达时间t,盘旋时间d,降落时间l,
#include
#include
#include
using namespace std;
int T,n;
int vis[11];
struct plane{
int t,d,l;
int lasttime;
}p[11];
bool cmp(plane p1,plane p2){ //只要dfs越早找到答案就越早返回true结束dfs,所有排序很有必要
return p1.lasttime>n;
for(int i=0;i>p[i].t>>p[i].d>>p[i].l;
p[i].lasttime=p[i].t+p[i].l;
}
sort(p,p+n,cmp);
if(dfs(0,0)) ans[cnt]="YES";
else ans[cnt]="NO";
cnt++; //保存答案一块输出
memset(p,0,sizeof(p));
memset(vis,0,sizeof(vis));
}
for(int i=0;im>>n;
memset(g,'0',sizeof(g)); ans=0;
for (int i=1; ig[i][j];
}
}
bfs1();//先在外面把海水都染成2,这样剩下的都是环(因为外面的水进不去环)
for (int i=1; ich1>>ch2;
for(int i=0;i