搜索+最优性剪枝。

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. Careercup - Google面试题 - 5377673471721472

    2014-05-08 22:42 题目链接 原题: How would you split a search query across multiple machines? 题目:如何把一个搜索que ...

  2. html5之canvas练习

    代码地址:github.com/peng666/blogs 在线地址:http://peng666.github.io/blogs/

  3. JS学习笔记-1--基本知识和注意事项

    1.JS开始的目的主要是验证表单的输入验证 2.是一种具有面向对象能力的.解释型语言.是基于事件驱动的相对较安全的客户端脚本语言 3.JS 特点:松散型:变量不具备一个明确的类型:   对象属性:把属 ...

  4. 引擎设计跟踪(九.14.2g) 将GNUMake集成到Visual Studio

    最近在做纹理压缩工具, 以及数据包的生成. shader编译已经在vs工程里面了, 使用custom build tool, build命令是调用BladeShaderComplier, 并且每个文件 ...

  5. [工作记录] Android OpenSL ES: references & AAC related

    AAC V.S. MP3 http://en.wikipedia.org/wiki/Advanced_Audio_Coding#AAC.27s_improvements_over_MP3 AAC pa ...

  6. C# excel操作

    开源的Excel操作项目: http://www.cnblogs.com/lwme/archive/2011/11/27/2265323.html 添加引用:Microsoft Excel 11.0 ...

  7. response ,request编码

    request.setCharacterEncoding()是你设置获得数据的编码方式.response.setCharacterEncoding()是你响应时设置的编码.response.setCo ...

  8. Android App集成支付宝

    原地址:http://blog.csdn.net/wenbingoon/article/details/7933078 手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统 ...

  9. MariaDB Galera Cluster 部署(如何快速部署 MariaDB 集群)

    MariaDB Galera Cluster 部署(如何快速部署 MariaDB 集群)  OneAPM蓝海讯通7月3日 发布 推荐 4 推荐 收藏 14 收藏,1.1k 浏览 MariaDB 作为 ...

  10. ASP.NET Excel 导入 Oracle 方法2

    先谈思路:前半部分和之前那篇日志的内容是一样的,把Excel数据导入到DataSet中,不同之处在于数据插入的方式: 本方法是拼接 INSERT INTO TABLE VALUES() 字符串,对,就 ...