0
点赞
收藏
分享

微信扫一扫

深搜(DFS)刷题(一)

mafa1993 2022-01-04 阅读 14

目录

一、前言

二、题目描述

①想要练习英语的同学,可以仔细读一下这个题面,看看能不能够读懂题目想要我们干嘛!

②下面是样例的输入输出(大家仔细读题哦!有言外之意)

三 、题目解读

四、思路分析

五、完整代码

六、AC凭证

七、水话


一、前言

哈哈哈今天真的好刺激,来自一个刚考完思修期末考的小蒟蒻,真的没有想到思修考试能够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真的死死的磕了呀!还有,原来很多女孩都会喜欢潇洒一点的男孩吗?还记得当初和那位朋友破裂的时候,她说的最后一句话,就是你潇洒一点嘛!看来我是得好好体会潇洒的词了!

举报

相关推荐

0 条评论