目录
①想要练习英语的同学,可以仔细读一下这个题面,看看能不能够读懂题目想要我们干嘛!
一、前言
哈哈哈今天真的好刺激,来自一个刚考完思修期末考的小蒟蒻,真的没有想到思修考试能够2个小时满满当当的用完时长也!然后呢因为明天要进行英语考试,一个叫狗子的英语大佬说英语有什么好复习的,但是我还是好慌英语。于是乎,为了想一个又能够练习英语,又能够过来发博客的方法,那么就给大家或者说给新接触算法的同学安利一个算法网站咯!没错,他就是CF(codeforces),就是一个打枪战的游戏(啊不是),然后呢,因为上次在讲子集的时候讲过关于深搜的模板,然后今天刚好每日一题刷的也是一道DFS的题目,so,let's start!
二、题目描述
①想要练习英语的同学,可以仔细读一下这个题面,看看能不能够读懂题目想要我们干嘛!
②下面是样例的输入输出(大家仔细读题哦!有言外之意)
三 、题目解读
为了帮助大家快速理解题目,以其中的一个样例作为例子。当n为5的时候,那么就有5个数1-5代操作,然后按照题目意思,根据证明,用n次操作一定可以让这5个数所构成的集合为空!那么操作是什么呢,就是一个人选取一段区间【l,r】,另外一个人从这个区间里面选择一个数d,然后简单来说,就是把d给删除掉,然后将剩下的数再次放到集合中去,所以大家不要想得太复杂!最后如果通过5次操作,且每一次操作的d都满足在一个人所选择的那一个区间内即可!整体过程如下
四、思路分析
为什么说这一题是一个深搜的题目呢?我们深搜的东西又是什么呢?其实在刚开始想这一题的时候,还没有那么快的想到DFS。刚开始其实会想到贪心,细心的同学应当发现了,倘若给的区间l,r相等的话,那么毋庸置疑的是,选择的那个d必定是l或者r,那么把这些特殊情况判定了之后呢?假如是上方的15区间,如何确定选的是3呢?其实在这里就会想到搜索了,我们关注到d是1-n中不同的数,且最终的答案只会有一种解,那么,我们就利用DFS去搜索到他的唯一解,然后再把解记录到一个数组里面去,最后输出其实就好了。那么我们写代码的时候进行了一个排序,为什么要进行排序呢,原因是我们想把区间更小的放在更前面进行搜索,一个是因为区间越小,在那一次搜索的时候,可以尝试的答案也就越少,那么依次推到区间更大的时候,因为我们访问数组vis【】访问过的元素不断的增加,因此,也会让大区间搜索的时间复杂度降低不少,这也是本题降低时间复杂度的一个非常好想到的贪心的排序思路。
五、完整代码
#include<bits/stdc++.h>
using namespace std;
int t,n; //t表示游戏的轮次数,n表示每轮游戏的n
//ans1记录下第x次搜索的结果,ans1最后按顺序赋值给ans,vis访问数组。
int ans1[1005],ans[1005],vis[1005];
struct game //记录每轮游戏的区间l和r的结构体
{
int l,r;
}ss[1005];
bool com(game s1,game s2) //sort要利用的比较函数
{
return (s1.r-s1.l)<(s2.r-s2.l);
}
void dfs_game(int x,int times) //深搜的模板,套路了
{
if(x>times) //已经找到了唯一的那一组解
{
for(int i=1;i<=times;i++)
ans[i]=ans1[i];
return;
}
for(int i=ss[x].l;i<=ss[x].r;i++)
{
if(ss[x].l==ss[x].r) //特判,减少后续的搜索(剪枝)
{
ans1[x]=ss[x].l;
vis[ss[x].l]=1;
dfs_game(x+1,times);
}
if(!vis[i]) //如果这个数没有被访问过
{
ans1[x]=i; //表示x次访问的d为i
vis[i]=1; //代表访问过
dfs_game(x+1,times);
vis[i]=0; //回溯的操作
}
}
}
int main()
{
cin>>t;
for(int i=1;i<=t;i++)
{
cin>>n;
for(int j=1;j<=n;j++)
{
cin>>ss[j].l>>ss[j].r;
}
sort(ss+1,ss+1+n,com);
dfs_game(1,n);
for(int j=1;j<=n;j++)
{
cout<<ss[j].l<<" "<<ss[j].r<<" "<<ans[j];
cout<<endl;
}
memset(vis,0,sizeof(vis)); //一定要重置访问数组,避免区间冲撞,搜索受影响
}
}
六、AC凭证
七、水话
今天说一下什么水话呢?其实感觉每次水话可能都没有人看,不过这个水话,就当我放弃写日记,但是另外的一种日记形式吧。昨天加上今天早上,看了一天的思修书啊,可是今天思修的一些选择题还是没有呼之欲出的感觉啊,看来我还是没有一个好的文科思维呢!今天突然迸发出一个想法,就是我要走成熟的路线了,感觉有的时候,我和小孩没啥区别,说话也很小孩子气,自己的性格啊,脾气啊,都有点小孩子。一点都没有大人的感觉。昨天看了《小敏家》,里面的cp真的死死的磕了呀!还有,原来很多女孩都会喜欢潇洒一点的男孩吗?还记得当初和那位朋友破裂的时候,她说的最后一句话,就是你潇洒一点嘛!看来我是得好好体会潇洒的词了!