HDU 4620 Fruit Ninja Extreme(2013多校第二场 剪枝搜索)
这题官方结题报告一直在强调不难,只要注意剪枝就行。
这题剪枝就是生命....没有最优化剪枝就跪了:如果当前连续切割数加上剩余的所有切割数没有现存的最优解多的话,不需要继续搜索了
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
# define MAX 33
using namespace std; struct node {
int id,tim,total;
int fr[11];
}cuts[MAX];
int n,m,w;
int ans[MAX],final,tmp[MAX],vis[222];
bool cmp (node a,node b) {
return a.tim < b.tim;
} void dfs(int v0,int step,int cur,int num) { // 源点,切割数,当前切割时间,已经切过的水果数
if(step > final) {
final = step;
for (int i=0; i<step; i++) ans[i] = tmp[i];
}
if(step + n - v0 - 1 <= final) return; //最优化剪枝
if(m - num < 3) return ;
int cnt = 0;
for(int i=v0+1; i<n; i++) {
if(cur == 0 || cuts[i].tim - cur <= w) { //cur为零时每个点作为第一刀都有可能
cnt = 0;
int erase[15]; //之前设为全局变量....各种跪
for(int j=0; j<cuts[i].total; j++) {
if(vis[cuts[i].fr[j]] == 0) {
cnt ++;
erase[cnt] = cuts[i].fr[j];
vis[cuts[i].fr[j]] = 1;
}
}
if(cnt >= 3) {
tmp[step] = cuts[i].id;
dfs(i,step+1,cuts[i].tim,num + cnt);
}
for(int j=1; j<=cnt; j++) vis[erase[j]] = 0;
}
}
} int main() {
int T;
cin >> T;
while(T--) {
scanf("%d%d%d",&n,&m,&w);
for(int i=0; i<n; i++) {
scanf("%d%d",&cuts[i].total,&cuts[i].tim);
cuts[i].id = i+1;
for(int j=0; j<cuts[i].total; j++) {
scanf("%d",&cuts[i].fr[j]);
}
}
final = 0;
memset(vis,0,sizeof(vis));
sort(cuts,cuts+n,cmp);
dfs(-1,0,0,0);
printf("%d\n",final);
sort(ans,ans+final);
for(int i=0; i<final; i++) {
if(i != final -1)
printf("%d ",ans[i]);
else printf("%d\n",ans[final - 1]);
}
}
return 0;
}
HDU 4620 Fruit Ninja Extreme(2013多校第二场 剪枝搜索)的更多相关文章
- 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的下一层起点应为当前选择的 i 的下一个,即DFS(i + 1)而不是DFS( cur + 1 ),cur+1代表当前起点的下一个.没想清楚,TLE到死…… #include ...
- hdu 4620 Fruit Ninja Extreme(状压+dfs剪枝)
对t进行从小到大排序(要记录ID),然后直接dfs. 剪枝的话,利用A*的思想,假设之后的全部连击也不能得到更优解. 因为要回溯,而且由于每次cut 的数目不会超过10,所以需要回溯的下标可以利用一个 ...
- HDU 4620 Fruit Ninja Extreme 暴搜
题目大意:题目就是描述的水果忍者. N表示以下共有 N种切水果的方式. M表示有M个水果需要你切. W表示两次连续连击之间最大的间隔时间. 然后下N行描述的是 N种切发 第一个数字C表示这种切法可以切 ...
- HDU 4614 Vases and Flowers (2013多校第二场线段树)
题意摘自:http://blog.csdn.net/kdqzzxxcc/article/details/9474169 ORZZ 题意:给你N个花瓶,编号是0 到 N - 1 ,初始状态花瓶是空的,每 ...
- hdu 6045: Is Derek lying? (2017 多校第二场 1001)【找规律】
题目链接 可以暴力找一下规律 比如,假设N=7,两人有5题相同,2题不同,枚举X=0->15时,Y的"Not lying"的取值范围从而找出规律 #include<bi ...
- hdu4620 Fruit Ninja Extreme
Fruit Ninja Extreme Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 2019牛客多校第二场 A Eddy Walker(概率推公式)
2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...
- hdu 4000 Fruit Ninja 树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4000 Recently, dobby is addicted in the Fruit Ninja. ...
随机推荐
- 自律训练法 John Sehorz
自律训练法,系1932年由德国精神医学医师John Sehorz所创立.他研究人们在催眠催眠状态下,所呈现的生理状态,如:沉重与温暖感.. ,因而,John Sehorz改以「逆向操作」之方式,由自我 ...
- dede调用指定的多个栏目导航
{dede:channelartlist row=' typeid='1,2这里输入多个指定的栏目ID' } <li><a href='{dede:field name='typeu ...
- DESTOON系统文章模块默认设置第一张图片为标题图的方法
连上FTP或者其他方法打开网站目录下的\module\article\admin\template\edit.tpl.php修改设置内容第 <input name="post[thum ...
- jq改变DIV中图片的路径
<script src="common/jquery.js"></script> <script language="javascript ...
- ubuntu安装过程未设置root密码
- 成为IT精英,我奋斗了7年
成为IT精英,我奋斗了7年 这些日子 我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能够为国内IT的发展尽自己一份微薄的力量.最近看到很多学生朋友和我当年一样没有方向 ,所以把我 ...
- PYTHON线程知识再研习G--线程间通信Event
很多时候,线程之间会有互相通信的需要.常见的情形是次要线程为主要线程执行特定的任务,在执行过程中需要不断报告执行的进度情况.前面的条件变量同步已经涉及到了线程间的通信(threading.Condit ...
- 深入浅出Node.js (8) - 构建Web应用
8.1 基础功能 8.1.1 请求方法 8.1.2 路径解析 8.1.3 查询字符串 8.1.4 Cookie 8.1.5 Session 8.1.6 缓存 8.1.7 Basic认证 8.2 数据上 ...
- 运行tomcat7w.exe tomcat7.exe ,提示 指定的服务未安装 unable to open the service 'tomcat7'
运行tomcat7w.exe tomcat7.exe ,提示 指定的服务未安装 unable to open the service 'tomcat7'(用的是绿色的Tomcat7) 解决方法: 打开 ...
- Web Service工作原理
Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的 ...