首页 > 代码库 > hdu4620Fruit Ninja Extreme
hdu4620Fruit Ninja Extreme
Fruit Ninja Extreme
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1177 Accepted Submission(s): 321
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.
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.
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.
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
2013 Multi-University Training Contest 2
Recommend
zhuyuanchen520
如果当前已经选择的方法数加上尚未判断的方法数依旧无法超越当前的最大值就返回
状压记录下路径
如果当前已经选择的方法数加上尚未判断的方法数依旧无法超越当前的最大值就返回
状压记录下路径
#include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include<iostream> #include<algorithm> #include<bitset> #include<climits> #include<list> #include<iomanip> using namespace std; vector<int>edge[40],cut[40]; int ans,vis[210],n,path,note[40]; struct Box { int c,t,id; bool operator < (Box x)const { return t<x.t; } }box[40]; void dfs(int from,int step) { if(step+n-from<=ans) return; path|=1<<box[from].id-1; note[step]=path; ans=max(step,ans); for(int i=0;i<edge[from].size();i++) { int to=edge[from][i]; int sum=0; for(int j=0;j<cut[box[to].id].size();j++) { int fruit=cut[box[to].id][j]; if(vis[fruit]++==0) sum++; } if(sum>=3) dfs(to,step+1); for(int j=0;j<cut[box[to].id].size();j++) { int fruit=cut[box[to].id][j]; vis[fruit]--; } } path^=1<<box[from].id-1; } int main() { int T; scanf("%d",&T); while(T--) { int m,w; scanf("%d%d%d",&n,&m,&w); for(int i=1;i<=n;i++) { box[i].id=i; scanf("%d%d",&box[i].c,&box[i].t); cut[i].clear(); int t; for(int j=0;j<box[i].c;j++) { scanf("%d",&t); cut[i].push_back(t); } } sort(box+1,box+n+1); for(int i=1;i<=n;i++) { edge[i].clear(); for(int j=i+1;j<=n;j++) if(box[j].t-box[i].t<=w) edge[i].push_back(j); } ans=0; for(int i=1;i<=n;i++) if(cut[box[i].id].size()>=3) { memset(vis,0,sizeof(vis)); for(int j=0;j<cut[box[i].id].size();j++) { int fruit=cut[box[i].id][j]; vis[fruit]=1; } dfs(i,1); } printf("%d\n",ans); bool flag=0; for(int i=1;i<=n;i++) { if(flag) printf(" "); if(note[ans]>>i-1&1) { flag=1; printf("%d",i); } } puts(""); } }
hdu4620Fruit Ninja Extreme
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。