HDU 4620 Fruit Ninja Extreme 搜索
搜索+最优性剪枝。
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 搜索的更多相关文章
- 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(2013多校第二场 剪枝搜索)
这题官方结题报告一直在强调不难,只要注意剪枝就行. 这题剪枝就是生命....没有最优化剪枝就跪了:如果当前连续切割数加上剩余的所有切割数没有现存的最优解多的话,不需要继续搜索了 #include &l ...
- 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表示这种切法可以切 ...
- 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[ ...
随机推荐
- C++ 排序函数 sort(),qsort()的含义与用法 ,字符串string 的逆序排序等
上学时我们很多学了很多种排序算法,不过在c++stl中也封装了sort等函数,头文件是#include <algorithm> 函数名 功能描述 sort 对给定区间所有元素进行排序 st ...
- mp3 切割
开源的东东很不错,摘了一段好文: 常在听mp3或其他格式音乐的朋友,有时会有特别喜欢的片段,例如副歌的部份会想拿来做手机的铃声.这时候就需要一些处理音效的软体,例如之前提过的 Audacity.其实还 ...
- dp--poj1458最长公共子序列
很水的一题 输入串a与串b: Dp[i][j]表示a串中1~i与b串中1~j的子串的最长公共子序列. Max{dp[i-1][j], dp[i][j-1]} (a[i]!=b[j]) Dp ...
- Linux嵌入式系统与硬件平台的关系
一. Linux嵌入式系统 操作系统是一种在计算机上运行的软件,它的主要任务是管理计算机上的系统资源,为用户提供使用计算机及其外部设备的接口.它存在的目的是为了管理所有硬件资源,并且提供应用软件一个合 ...
- eclipse中设置中文javadoc+如何查看class的中文javadoc
一. eclipse中设置中文javadoc 1.先到http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish ...
- jquery的ajax向后台提交时,乱码的解决方案
1. 可以给每个参数加上encodeURIComponent(),然后在后台获得参数后用URLDecoder.decode(string, 'utf-8')解码. 2. 后台不用解码. $.ajax( ...
- IBatis 常用XML
<select id="GetInfo"> <![CDATA[ select * from vi_WaterStation ]]> <dynami ...
- Codeforces Round #204 (Div. 2)->D. Jeff and Furik
D. Jeff and Furik time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- sql server 批量删除数据表
SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Auth ...
- Linuxshell脚本之if条件判断
IF条件判断 .基本语法: if [ command ]; then 符合该条件执行的语句 fi .扩展语法: if [ command ];then 符合该条件执行的语句 elif [ comman ...