解题思路:
刚开始看到题大家的第一思维可能是贪心,一次找到最佳下落方案,如果能下就yes,不能就no
写这道题的时候我脑袋里想到的是洛谷的导弹拦截和最大字段和,以最晚降落时间升序排序得到的下降顺序为最佳方案(这个应该是错的因为我敲完只过了两个点)
n只有10,所以枚举完全可以过,用深搜将每一种方案枚举出来,判断是否可以全部降落,枚举用深搜来实现
注意事项:
参考代码:
#include
#include
using namespace std;
int q;
int n;
int vis[20];
typedef struct plan{
int x;
int y;
int z;
int tt;
}plan;
plan pl[20];
int flat;
//这个mm是我上一架飞机降落后的时间,用来判断当前飞机开始降落的时间
void dfs(int def,int mm){
if(def>n) return;
for(int i=1;i<=n;i++){
if(vis[i]) continue;
if(def==1){
mm=pl[i].x;
}
if(mm>pl[i].tt) return;
if(def==n) flat=1;
vis[i]=1;
if(pl[i].x>mm) dfs(def+1,pl[i].x+pl[i].z);//这个小细节可能会忽略到(飞机下落完毕后是否到达了下一架飞机下落的最早时间)
else dfs(def+1,mm+pl[i].z);
vis[i]=0;
int main(){
cin>>q;
while(q--){
flat=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>pl[i].x>>pl[i].y>>pl[i].z;
pl[i].tt=pl[i].x+pl[i].y;
}
dfs(1,0); // 初始化:第一层,降落后的时间为0
if(flat==1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复