搜索+最优性剪枝。

DFS的下一层起点应为当前选择的 i 的下一个,即DFS(i + 1)而不是DFS( cur + 1 ),cur+1代表当前起点的下一个。没想清楚,TLE到死……

 #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> using namespace std; const int MAXN = ; struct node
{
int t, id;
int cnt;
int fruit[];
}; int N, M, W;
int ansN, tmpN;
node D[MAXN];
int tmp[MAXN];
int ans[MAXN];
bool vis[]; bool cmp( node a, node b )
{
return a.t < b.t;
} void chuli( int cnt )
{
for ( int i = ; i < cnt; ++i )
ans[i] = tmp[i];
return;
} int change( int i, int *temp )
{
int cnt = ;
for ( int j = ; j < D[i].cnt; ++j )
{
int idx = D[i].fruit[j];
if ( !vis[ idx ] )
temp[cnt] = idx, ++cnt;
}
return cnt;
} void MyRestore( int *temp, int cnt )
{ for ( int j = ; j < cnt; ++j )
{
vis[ temp[j] ] = false;
}
return;
} void DFS( int cur, int pre, int sum )
{
if ( tmpN > ansN )
{
ansN = tmpN;
chuli( tmpN );
}
if ( cur >= N ) return;
if ( tmpN + N - cur <= ansN ) return;
if ( M - sum < ) return; for ( int i = cur; i < N; ++i )
{
if ( pre != - && D[i].t - D[pre].t > W ) break; if ( D[i].cnt < ) continue;
int temp[];
int left = change( i, temp );
if ( left < ) continue; for ( int j = ; j < left; ++j )
{
int idx = temp[j];
vis[idx] = true;
} tmp[ tmpN++ ] = D[i].id;
DFS( i + , i, sum + left ); //i+1 不是 cur+1 !!!!!
--tmpN;
MyRestore( temp, left );
} return;
} int main()
{
//freopen( "1010.in", "r", stdin );
//freopen( "s.out", "w", stdout );
int T;
scanf( "%d", &T );
while ( T-- )
{
scanf( "%d%d%d", &N, &M, &W );
for ( int i = ; i < N; ++i )
{
D[i].id = i + ;
scanf("%d%d", &D[i].cnt, &D[i].t );
for ( int j = ; j < D[i].cnt; ++j )
scanf( "%d", &D[i].fruit[j] );
}
sort( D, D + N, cmp ); ansN = ;
tmpN = ;
memset( vis, false, sizeof(vis) );
DFS( , -, ); sort( ans, ans + ansN );
printf( "%d\n", ansN );
for ( int i = ; i < ansN; ++i )
{
if ( i ) putchar(' ');
printf( "%d", ans[i] );
}
puts("");
}
return ;
}

HDU 4620 Fruit Ninja Extreme 搜索的更多相关文章

  1. hdu 4620 Fruit Ninja Extreme

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

  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. Eclipse Kepler中配置JadClipse

    Jad是一个Java的一个反编译工具,是用命令行执行,和通常JDK自带的java,javac命令是一样的.不过因为是控制台运行,所以用起来不太方便.不过幸好有一个eclipse的插件JadClipse ...

  2. shell编程之数学运算

    shell数学运算支持整数运算的四种方法 1.let命令 no1=4; no2=5; let result=no1+no2 2.[]操作符 result=$[ no1 + no2] 3.(())操作符 ...

  3. poj 3264 Balanced Lineup 区间极值RMQ

    题目链接:http://poj.org/problem?id=3264 For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) alw ...

  4. 【bzoj1013】[JSOI2008]球形空间产生器sphere

    1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4530  Solved: 2364[Subm ...

  5. Long和Date数据类型之间相互转换代码 - 调整时间推前往后,截取long型日期方法。

    SimpleDateFormat DATETIME_SEC_STR = new SimpleDateFormat("yyyyMMddHHmmss"); SimpleDateForm ...

  6. Grid行编辑插件

    //操作列不显示应该就是autoLoad的问题.         Ext.onReady(function () {             Ext.BLANK_IMAGE_URL = "E ...

  7. 如何说服你的老板必须使用APM?

    APM研究院 2015/04/24 16:56 2013年,某权威机构提供一组数据显示:亚马逊每100毫秒延迟会使销售额下降1%:雅虎一秒钟服务器延迟导致收入下降2.8%:谷歌搜索结果页面放缓100毫 ...

  8. POJ 1661 Help Jimmy (dijkstra,最短路)

    刚在百度搜索了一下这道题的题解, 因为看到有别人用动态规划做的,所以想参考一下. 结果顺带发现了有那么几个网站,上面的文章竟然和我这篇一模一样(除了一些明显的错别字外),我去,作者还是同一个人Admi ...

  9. [LeetNode]Sort List

    Sort a linked list in O(n log n) time using constant space complexity. 思路:分治+递归. /** * Definition fo ...

  10. SQL技术内幕-5 比较特殊 insert into 数据的写法

    ---比较特殊,第一次看到这种写法,记录下来 create table Student --学生成绩表 ( id int, --主键 Grade int, --班级 Score int --分数 ) ...