总结:为什么你看到题想不出来怎么写呢,我想不到这道题还会用到dfs的思想,顶多能知道可能会有贪心,还是得多做题。
这道题让我想起来导弹拦截和借教室,记得有空做做!!不要研究难题,把基本算法研究透了!!!别死磕,要灵活!
DFS代码:
//要用DFS
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int tt;
int n;
struct node{
int t;
int d;
int l;
};
node a[15];
bool st[15];
bool dfs(int u,int last){
if(u == n) return true;//如果搜索过所有点
for(int i=0;i<n;i++){
int t=a[i].t,d=a[i].d,l=a[i].l;
if(!st[i] && t+d >= last)//如果没有被搜索过,并且 这一次a[i]的开头在上一次结束的时间后面
{
st[i] = true;//能被搜索
if(dfs(u+1,max(last,t)+l))
return true;
st[i] = false;//恢复现场
}
}
return false;
}
int main()
{
scanf("%d",&tt);
while(tt--){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d%d",&a[i].t,&a[i].d,&a[i].l);
//或者scanf("%d%d%d",&t,&d,&l);
// p[i] = {t,d,l};
}
memset(st,false,sizeof(st));
if(dfs(0,0)) puts("YES");
else puts("NO");
}
return 0;
}