山東省第三屆ACM大學生程式設計競賽 Fruit Ninja I(01揹包)
阿新 • • 發佈:2019-02-07
01揹包 加上vector的運用,貪心sort排序
#include <stdio.h> #include <vector> #include <string.h> #include <iostream> #include <algorithm> #include <queue> using namespace std; struct Node { int a,b; }node; bool cmp(Node a,Node b) { return a.b<b.b; } int d[10009],c[209],dp[10009][209]; vector<Node>a[10009]; int main() { int t,cnt=1; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); for(int i=0;i<=10008;i++)a[i].clear(); int x,t=0; for(int i=1;i<=n;i++) { scanf("%d%d%d",&x,&node.a,&node.b); t=max(t,x); a[x].push_back(node); } for(int i=1;i<=t;i++) sort(a[i].begin(),a[i].end(),cmp); for(int i=1;i<=t;i++) { int max1=-10000,flag=0; c[0]=0; for(int j=0;j<a[i].size();j++) { if(a[i][j].a==0) { flag++; c[j+1]=c[j]>0?c[j]:0; c[j+1]++; if(flag==3)c[j+1]+=3; if(flag>3)c[j+1]++; } if(a[i][j].a==1) { flag=0; c[j+1]=c[j]-1; } max1=max(c[j+1],max1); } d[i]=max1; } dp[0][0]=dp[1][0]=0; for(int i=1;i<=t;i++) { if(i-m<=1)dp[i][1]=d[i]; else dp[i][1]=max(dp[i-m-1][1]+d[i],dp[i-m-1][0]+d[i]); dp[i][0]=max(dp[i-1][1],dp[i-1][0]); } printf("Case %d: %d\n",cnt++,max(dp[t][0],dp[t][1])); } return 0; }