Fruit Ninja Extreme

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 880    Accepted Submission(s): 231
Special Judge
Problem Description
Cut or not to cut, it is a question.

In Fruit Ninja, comprising three or more fruit in one cut gains extra bonuses. This kind of cuts are called bonus cuts.

Also, performing the bonus cuts in a short time are considered continual, iff. when all the bonus cuts are sorted, the time difference between every adjacent cuts is no more than a given period length of W.

As a fruit master, you have predicted the times of potential bonus cuts though the whole game. Now, your task is to determine how to cut the fruits in order to gain the most bonuses, namely, the largest number of continual bonus cuts.

Obviously, each fruit is allowed to cut at most once. i.e. After previous cut, a fruit will be regarded as invisible and won't be cut any more.

In addition, you must cut all the fruit altogether in one potential cut. i.e. If your potential cut contains 6 fruits, 2 of which have been cut previously, the 4 left fruits have to be cut altogether.
 
Input
There are multiple test cases.

The first line contains an integer, the number of test cases.

In each test case, there are three integer in the first line: N(N<=30), the number of predicted cuts, M(M<=200), the number of fruits, W(W<=100), the time window.

N lines follows.

In each line, the first integer Ci(Ci<=10) indicates the number of fruits in the i-th cuts.

The second integer Ti(Ti<=2000) indicate the time of this cut. It is guaranteed that every time is unique among all the cuts.

Then follow Ci numbers, ranging from 0 to M-1, representing the identifier of each fruit. If two identifiers in different cuts are the same, it means they represent the same fruit.

 
Output
For each test case, the first line contains one integer A, the largest number of continual bonus cuts.

In the second line, there are A integers, K1, K2, ..., K_A, ranging from 1 to N, indicating the (Ki)-th cuts are included in the answer. The integers are in ascending order and each separated by one space.  If there are multiple best solutions, any one is accepted.
 
Sample Input
1
4 10 4
3 1 1 2 3
4 3 3 4 6 5
3 7 7 8 9
3 5 9 5 4
 
Sample Output
3
1 2 3
 
Source
 
题意:
水果忍者模型。
N表示以下共有 N种切水果的方式。
M表示有M个水果需要你切。
W表示两次连续连击之间最大的间隔时间。
然后下N行描述的是 N种切法
第一个数字C表示这种切法可以切多少个水果。
第二个数字表示这种切法所处在的时间。
后C个数字表示此时这种切法所切掉的水果编号。
注意:同时切3个以上才表示连击,一个水果最多只能切一次。

思路:
按时间从小到大排序后,从前往后搜,不用回溯。

剪枝:
当前连击数+剩下能够切的次数<=ans时就不用搜了。

感想:
哎,没玩过水果忍者,比赛时把题意读错了。衰~   题意读懂后就是一般的搜索题了,其实不想写博客的,hdu上首次排名第一,纪念一下吧。

代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 31
using namespace std; int n,m,w,ans,num;
int a[maxn],ansa[maxn];
bool app[201];
struct Node
{
int id,cnt,time;
int v[11];
} pp[maxn]; bool cmp(const Node&xx,const Node&yy)
{
return xx.time<yy.time;
}
void dfs(int pos,int cxx,int pretime)
{
int i,j,t,tmp[11];
if(ans<cxx-1)
{
ans=cxx-1;
for(i=1; i<=ans; i++)
{
ansa[i]=pp[a[i]].id;
}
}
if(cxx+n-pos<=ans||ans==n||pos>n) return ;
if(pp[pos].time-pretime<=w)
{
t=0;
for(i=1; i<=pp[pos].cnt; i++)
{
if(app[pp[pos].v[i]]) t++;
}
if(t>=3)
{
for(i=1; i<=pp[pos].cnt; i++)
{
tmp[i]=app[pp[pos].v[i]];
app[pp[pos].v[i]]=0;
}
a[cxx]=pos;
dfs(pos+1,cxx+1,pp[pos].time);
for(i=1; i<=pp[pos].cnt; i++)
{
app[pp[pos].v[i]]=tmp[i];
}
}
dfs(pos+1,cxx,pretime);
}
else return ;
}
int main()
{
int i,j,t,u,sz;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&w);
for(i=1; i<=n; i++)
{
pp[i].id=i;
scanf("%d%d",&pp[i].cnt,&pp[i].time);
for(j=1; j<=pp[i].cnt; j++)
{
scanf("%d",&pp[i].v[j]);
}
}
sort(pp+1,pp+n+1,cmp);
ans=0;
memset(app,1,sizeof(app));
for(i=1; i<=n; i++)
{
a[1]=i;
for(j=1; j<=pp[i].cnt; j++)
{
app[pp[i].v[j]]=0;
}
dfs(i+1,2,pp[i].time);
for(j=1; j<=pp[i].cnt; j++)
{
app[pp[i].v[j]]=1;
}
}
sort(ansa+1,ansa+ans+1);
printf("%d\n",ans);
for(i=1; i<ans; i++)
{
printf("%d ",ansa[i]);
}
printf("%d\n",ansa[i]);
}
return 0;
}


hdu 4620 Fruit Ninja Extreme的更多相关文章

  1. HDU 4620 Fruit Ninja Extreme 搜索

    搜索+最优性剪枝. DFS的下一层起点应为当前选择的 i 的下一个,即DFS(i + 1)而不是DFS( cur + 1 ),cur+1代表当前起点的下一个.没想清楚,TLE到死…… #include ...

  2. HDU 4620 Fruit Ninja Extreme(2013多校第二场 剪枝搜索)

    这题官方结题报告一直在强调不难,只要注意剪枝就行. 这题剪枝就是生命....没有最优化剪枝就跪了:如果当前连续切割数加上剩余的所有切割数没有现存的最优解多的话,不需要继续搜索了 #include &l ...

  3. hdu 4620 Fruit Ninja Extreme(状压+dfs剪枝)

    对t进行从小到大排序(要记录ID),然后直接dfs. 剪枝的话,利用A*的思想,假设之后的全部连击也不能得到更优解. 因为要回溯,而且由于每次cut 的数目不会超过10,所以需要回溯的下标可以利用一个 ...

  4. HDU 4620 Fruit Ninja Extreme 暴搜

    题目大意:题目就是描述的水果忍者. N表示以下共有 N种切水果的方式. M表示有M个水果需要你切. W表示两次连续连击之间最大的间隔时间. 然后下N行描述的是 N种切发 第一个数字C表示这种切法可以切 ...

  5. hdu4620 Fruit Ninja Extreme

    Fruit Ninja Extreme Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  6. hdu 4000 Fruit Ninja 树状数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4000 Recently, dobby is addicted in the Fruit Ninja. ...

  7. HDU 4116 Fruit Ninja

    http://acm.hdu.edu.cn/showproblem.php?pid=4116 题意:给N个圆,求一条直线最多能经过几个圆?(相切也算) 思路:枚举中心圆,将其他圆的切线按照极角排序,并 ...

  8. hdu - 3952 Fruit Ninja(简单几何)

    思路来自于:http://www.cnblogs.com/wuyiqi/archive/2011/11/06/2238530.html 枚举两个多边形的两个点组成的直线,判断能与几个多边形相交 因为最 ...

  9. HDU 4000 Fruit Ninja 树状数组 + 计数

    给你N的一个排列,求满足:a[i] < a[k] < a[j] 并且i < j < k的三元组有多少个. 一步转化: 求出所有满足 a[i] < a[k] < a[ ...

随机推荐

  1. linux会话命令screen详解

    Screen会话命令 我其实是把文件下载到 /home/zhang/temp/ 里面,当我N久以后再联上服务器,想看看文件下载情况怎样,那又要 cd 老半天,这时候 screen 就是好帮手了. 顾名 ...

  2. 通用Makefile

    本文推荐了一个用于对 C/C++ 程序进行编译和连接以产生可执行程序的通用 Makefile. 在使用 Makefile 之前,只需对它进行一些简单的设置即可:而且一经设置,即使以后对源程序文件有所增 ...

  3. Gym 100570E : Palindrome Query

    De Prezer loves palindrome strings. A string s1s2...sn is palindrome if and only if it is equal to i ...

  4. SQL Interview Question

    面试的时候发现会问一些SQL的基本问题,在此总结一下. ProgramInterview/SQL 这个网站上的问题还比较全. 1. Join type INNER JOIN: Returns all ...

  5. Palindrome Partitioning 解答

    Question Given a string s, partition s such that every substring of the partition is a palindrome. R ...

  6. Java 安装配置

    1.下载 进入官方网站,点击下载链接进入下载页面,选择合适的版本(如,jdk-6u31-windows-i586.exe)下载. 2.安装 双击jdk-6u31-windows-i586.exe文件, ...

  7. 关于padding

    例子 1 padding:10px 5px 15px 20px; 上内边距是 10px 右内边距是 5px 下内边距是 15px 左内边距是 20px 例子 2 padding:10px 5px 15 ...

  8. SpringMVC(二)——流程控制

    SpringMVC主要就是用来做流程控制的,这篇博客总结一下如何在流程控制添加Interceptor(拦截器),如何将进行流程Mapping映射解析,如何编写Controller(控制器). 一,首先 ...

  9. A10 平板开发二搭建Android开发环境

    我是直接在Ubuntu 12.10 64位系统下操作的,搭建Ubuntu开发环境类似,见Ubuntu 10.04开发环境配置.需要注意的是,64位的系统,需要安装支持32位的库(sudo apt-ge ...

  10. 介绍一款Android小游戏--交互式人机对战五子棋

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6589025 学习Android系统开发之余,编 ...