dfs-hdu-4620-Fruit Ninja Extreme
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4620
题目大意:
切水果。给n刀,每刀的时间,每刀切的水果的种类。求能切的最多的刀数,使得每相邻的两刀时间差不超过给定的w.前面切了的水果不能再切,每刀至少要切不少于三个的新的水果。
解题思路:
直接一个一个的暴搜的话会超时。
这里从每相邻两刀时间间隔不能超过w来考虑剪枝。问题抽象出来就是从给定的刀中选,相邻的选的话,不如按时间排序从小到大选,这样的效果更好,而且还可以剪枝。
本题排序剪枝很关键。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; //freopen("data.in","r",stdin);
//freopen("data.out","w",stdout); int hav[220]; //hav[i]表示已经切了的水果i
int ti[35],num[35],fru[35][12],pos[35];
int n,m,w; struct Node
{
int sa[35];
int cnt;
}ans,temp; //对时间进行排序后,可以大大剪枝。
void dfs(int cur)
{
if(temp.cnt>ans.cnt)
ans=temp;
if(n-cur+temp.cnt<=ans.cnt)//这个剪枝很关键
return ;
for(int i=cur+1;i<=n;i++) //排序后可以剪枝
{
int pp=pos[i];
int aa[12];
if(temp.cnt&&ti[pp]-ti[pos[cur]]>w) //如果前面至少选了一个
break;
int sum=0; //前面一个都没选的话,任何一个都可以作为第一个
for(int j=1;j<=num[pp];j++)
{
aa[j]=hav[fru[pp][j]];
if(!aa[j])
sum++;
}
if(sum<3)
continue;
for(int j=1;j<=num[pp];j++)
hav[fru[pp][j]]|=1; temp.sa[++temp.cnt]=pp;
dfs(i);
temp.cnt--;
for(int j=1;j<=num[pp];j++)
hav[fru[pp][j]]=aa[j];
}
}
bool cmp(int a,int b)
{
return ti[a]<ti[b];
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&w);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&num[i],&ti[i]);
for(int j=1;j<=num[i];j++)
scanf("%d",&fru[i][j]);
pos[i]=i;
}
sort(pos+1,pos+n+1,cmp); //对时间进行排序
ans.cnt=0,temp.cnt=0;
memset(hav,0,sizeof(hav));
dfs(0);
printf("%d\n",ans.cnt);
sort(ans.sa+1,ans.sa+ans.cnt+1);//输出按升序来
if(!ans.cnt)
continue;
printf("%d",ans.sa[1]);
for(int i=2;i<=ans.cnt;i++)
printf(" %d",ans.sa[i]);
putchar('\n');
}
return 0;
}
dfs-hdu-4620-Fruit Ninja Extreme的更多相关文章
- hdu 4620 Fruit Ninja Extreme
Fruit Ninja Extreme Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4620 Fruit Ninja Extreme(状压+dfs剪枝)
对t进行从小到大排序(要记录ID),然后直接dfs. 剪枝的话,利用A*的思想,假设之后的全部连击也不能得到更优解. 因为要回溯,而且由于每次cut 的数目不会超过10,所以需要回溯的下标可以利用一个 ...
- HDU 4620 Fruit Ninja Extreme 搜索
搜索+最优性剪枝. DFS的下一层起点应为当前选择的 i 的下一个,即DFS(i + 1)而不是DFS( cur + 1 ),cur+1代表当前起点的下一个.没想清楚,TLE到死…… #include ...
- HDU 4620 Fruit Ninja Extreme(2013多校第二场 剪枝搜索)
这题官方结题报告一直在强调不难,只要注意剪枝就行. 这题剪枝就是生命....没有最优化剪枝就跪了:如果当前连续切割数加上剩余的所有切割数没有现存的最优解多的话,不需要继续搜索了 #include &l ...
- HDU 4620 Fruit Ninja Extreme 暴搜
题目大意:题目就是描述的水果忍者. N表示以下共有 N种切水果的方式. M表示有M个水果需要你切. W表示两次连续连击之间最大的间隔时间. 然后下N行描述的是 N种切发 第一个数字C表示这种切法可以切 ...
- hdu4620 Fruit Ninja Extreme
Fruit Ninja Extreme Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 4000 Fruit Ninja 树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4000 Recently, dobby is addicted in the Fruit Ninja. ...
- HDU 4116 Fruit Ninja
http://acm.hdu.edu.cn/showproblem.php?pid=4116 题意:给N个圆,求一条直线最多能经过几个圆?(相切也算) 思路:枚举中心圆,将其他圆的切线按照极角排序,并 ...
- hdu - 3952 Fruit Ninja(简单几何)
思路来自于:http://www.cnblogs.com/wuyiqi/archive/2011/11/06/2238530.html 枚举两个多边形的两个点组成的直线,判断能与几个多边形相交 因为最 ...
- HDU 4000 Fruit Ninja 树状数组 + 计数
给你N的一个排列,求满足:a[i] < a[k] < a[j] 并且i < j < k的三元组有多少个. 一步转化: 求出所有满足 a[i] < a[k] < a[ ...
随机推荐
- 新技能get: 使用whois查询不明网址的信息
1.站长之家-->Whois反查 http://whois.chinaz.com/ 进入whois.chinaz.com,输入要查询的网址,选择查询即可.
- .NET参数化Oracle查询参数
最近在做数据库移植工作(SqlServer 2008 -> Oracle 11g),遇到一些不兼容的问题,以下是一个参数化方面的区别,资料来自其他网友,在此整理了一下. public stati ...
- python--help
python help 学习python的过程中,难免遇到一些生疏的东西,为此需要参看相关的文档说明. Linux下众所周知有man可以查找系统的命令帮助页:对于python也提供了自己的帮助文档的2 ...
- Visual Studio调试技巧 -- Attach to Process #Reprinted#
from:http://www.cnblogs.com/lyosaki88/p/3481338.html 一般写完代码时,我们通常会启动调试运行一下看看是否正确,启动运行的方式无非是F5-- Star ...
- open和fopen的区别:
1.缓冲文件系统缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量.执行 ...
- Qt 代码: 子窗口调用父窗口(其实就是用指针直接访问)
之前的 Qt 编程大多只涉及简单的多窗口,并未染指窗口间的传值交互,想来还是“涉世未深”,对 Qt 的理解.应用还需殷勤努力. 这次的问题是这样的,我想要实现一个类似QQ.阿里旺旺的聊天客户端,在弹出 ...
- There is an error in invoking javac. A full JDK (not just JRE) is required
最近调整了磁盘分区,硬盘里什么都没有了,可惜了我很多项目还有数据库资源然后把以前ssh项目重新导入进来的时候出现了一个错误org.apache.jasper.JasperException: PWC6 ...
- 用C语言写一个程序,得出当前系统的整形数字长(16位,32位,64位)等,不能使用sizeof()
#include <iostream>#include <cmath>using namespace std; int main(){ int num = -1; unsign ...
- 在MDK中怎样生成*.bin格式的文件?
在Realview MDK的集成开发环境中.默认情况下能够生成*.axf格式的调试文件和*.hex格式的可运行文件. 尽管这两个格式的文件很有利于ULINK2仿真器的下载和调试,可是ADS的用户更习惯 ...
- sc delete 服务名
当我们在cmd里使用 sc delete 服务名 ,来删除服务的时候,报错误,SC OpenService 失败5:拒绝访问. 这似乎是因为权限不够,解决方法. 首先,我们必须先取得管理员权限,以 ...