Codeforces Beta Round #90 C. Education Reform
2014-08-25 02:48
441 查看
先把课程按照难度排序。
dp[i][j][k]表示已经选了i门课,最后选出的一门课是排序后的第j个,最后一门课安排的作业量是k+p[j].a的时候最多的作业量和是多少。转移的时候枚举下一门选择的课程,判断下K*(p[j].a+k),K+(p[j].a+k)和下一门课程作业的范围之间的关系就可以了,dp时维护路径,输出解。注意不要用非法状态去转移。
dp[i][j][k]表示已经选了i门课,最后选出的一门课是排序后的第j个,最后一门课安排的作业量是k+p[j].a的时候最多的作业量和是多少。转移的时候枚举下一门选择的课程,判断下K*(p[j].a+k),K+(p[j].a+k)和下一门课程作业的范围之间的关系就可以了,dp时维护路径,输出解。注意不要用非法状态去转移。
#include <bits/stdc++.h> using namespace std; __int64 dp[51][51][109]; int X[51][51][109],Y[51][51][109]; struct node { __int64 a,b; int c,id; bool operator<(const node &rhs)const { return c<rhs.c; } }p[55]; int n,m,K; void output(int dep,int x,int y) { if(dep==0) return ; output(dep-1,X[dep][x][y],Y[dep][x][y]); printf("%d %I64d\n",p[x].id,p[x].a+y); } int main() { scanf("%d%d%d",&n,&m,&K); for(int i=1;i<=m;i++) { scanf("%I64d%I64d%d",&p[i].a,&p[i].b,&p[i].c); p[i].id=i; } sort(p+1,p+1+m); for(int i=1;i<=m;i++) { for(int j=0;j<=p[i].b-p[i].a;j++) { dp[1][i][j]=p[i].a+j; } } for(int i=1;i<n;i++) { for(int j=i;j<=m;j++) { for(int k=0;k<=p[j].b-p[j].a;k++) { __int64 cur=p[j].a+k; if(dp[i][j][k]==0) continue; //非法状态 for(int x=j+1;x<=m;x++) { if(p[x].c==p[j].c) continue; if(p[x].a<=cur+K&&cur+K<=p[x].b) { if(dp[i+1][x][cur+K-p[x].a]<dp[i][j][k]+K+cur) { dp[i+1][x][cur+K-p[x].a]=dp[i][j][k]+K+cur; X[i+1][x][cur+K-p[x].a]=j; Y[i+1][x][cur+K-p[x].a]=k; } } if(p[x].a<=cur*K&&cur*K<=p[x].b) { if(dp[i+1][x][cur*K-p[x].a]<dp[i][j][k]+K*cur) { dp[i+1][x][cur*K-p[x].a]=dp[i][j][k]+K*cur; X[i+1][x][cur*K-p[x].a]=j; Y[i+1][x][cur*K-p[x].a]=k; } } } } } } __int64 ans=0; int x,y; for(int i=1;i<=m;i++) for(int j=0;j<=100;j++) { if(ans<dp [i][j]) { ans=dp [i][j]; x=i;y=j; } } if(ans==0) { printf("NO\n"); } else { printf("YES\n"); output(n,x,y); } //system("pause"); return 0; }
相关文章推荐
- Codeforces Beta Round #90 A题
- Codeforces Beta Round #90 C题
- Codeforces Beta Round #90, problem: (C) Education Reform DP
- Codeforces Beta Round #13 E. Holes (分块)
- Codeforces Beta Round #62 题解【ABCD】
- Codeforces Beta Round #62 ——B. Energy exchange
- Codeforces Beta Round #1 A. Theatre Square
- Codeforces Beta Round #75 (Div. 2 Only) A题
- Codeforces Beta Round #34 (Div. 2) A题 B题 C题(水水~)
- Codeforces Beta Round #1 B. Spreadsheets
- Codeforces Beta Round #35 (Div. 2) E. Parade(成段更新)
- Codeforces Beta Round #7 C. Line 扩展欧几里德
- Codeforces Beta Round #1 Theatre Square
- Codeforces Beta Round #32 (Div. 2) C (math+思维)
- 由codeforces beta round 1 总结的一些知识
- Codeforces Beta Round #50 C. First Digit Law(概率dp,好题)
- Codeforces Beta Round #14 (Div. 2) D. Two Paths 树形dp
- 【Codeforces Beta Round 2A】【模拟 map 有map的java实现哦】Winner 第一个达到最终最高分的人名
- Codeforces Beta Round #75 (Div. 1 Only) A题
- Codeforces Beta Round #73 (Div. 2 Only)——A,B,C