Codeforces 119C DP
2016-05-05 12:12
399 查看
题意:
有n天,m门课和常数k;
每天上一门课,每门课程有两个属性,最少作业量a,最多作业量b,和难度c。
1<=a<=b<=1e16
c<=100
1<=n<=m<=50 1<=k<=100
要求所有课程的作业量总和最多。
要求除第一天外,其他情况下作业量是前一天加k或者前一天乘k。
输出每天课程的序号,以及该课程应该布置的作业量。
思路:
dp[i][j][k]代表第i门课,第j作业量,第k天的总和。
注意j是相对最少作业量的位移量。
有n天,m门课和常数k;
每天上一门课,每门课程有两个属性,最少作业量a,最多作业量b,和难度c。
1<=a<=b<=1e16
c<=100
1<=n<=m<=50 1<=k<=100
要求所有课程的作业量总和最多。
要求除第一天外,其他情况下作业量是前一天加k或者前一天乘k。
输出每天课程的序号,以及该课程应该布置的作业量。
思路:
dp[i][j][k]代表第i门课,第j作业量,第k天的总和。
注意j是相对最少作业量的位移量。
#include<bits/stdc++.h> using namespace std; struct st{ int id,c; unsigned long long a,b,num; }; bool cmp(st a,st b){ return a.c<b.c; } st jilu[100]; unsigned long long dp[55][105][55]; int fi[55][105][55],fj[55][105][55]; stack<pair<unsigned long long,int> >ss; int main() { int n,m; unsigned long long kk; scanf("%d%d%I64u",&n,&m,&kk); for(int i=0;i<m;i++){ int tmp; scanf("%I64u%I64u%d",&jilu[i].a,&jilu[i].b,&jilu[i].c); jilu[i].num=jilu[i].b-jilu[i].a; jilu[i].id=i+1; } sort(jilu,jilu+m,cmp); for(int i=0;i<m;i++){ for(int k=1;k<=n;k++){ for(int j=0;j<=jilu[i].num;j++){ if(i==0){ if(k==1) dp[i][j][k]=j+jilu[i].a; } else if(k==1){ dp[i][j][k]=j+jilu[i].a; } else{ long long t=jilu[i].a+j-kk; for(int w=0;w<i;w++){ if(jilu[w].c>=jilu[i].c)break; if(jilu[w].a>t||jilu[w].b<t)continue; long long tt=t-jilu[w].a; if(dp[w][tt][k-1]){ if(dp[i][j][k]<jilu[i].a+j+dp[w][tt][k-1]){ dp[i][j][k]=jilu[i].a+j+dp[w][tt][k-1]; fi[i][j][k]=w; fj[i][j][k]=tt; } } } t=jilu[i].a+j; if(t%kk==0){ t/=kk; for(int w=0;w<i;w++){ if(jilu[w].c>=jilu[i].c)break; if(jilu[w].a>t||jilu[w].b<t)continue; long long tt=t-jilu[w].a; if(dp[w][tt][k-1]){ if(dp[i][j][k]<jilu[i].a+j+dp[w][tt][k-1]){ dp[i][j][k]=jilu[i].a+j+dp[w][tt][k-1]; fi[i][j][k]=w; fj[i][j][k]=tt; } } } } } } } } long long ans=0; int idi,idj; for(int i=0;i<m;i++){ for(int j=0;j<=jilu[i].num;j++){ if(ans<dp[i][j] ){ ans=dp[i][j] ; idi=i; idj=j; } } } if(ans==0){ puts("NO"); return 0; } while(n--){ int n_idi=fi[idi][idj][n+1]; int n_idj=fj[idi][idj][n+1]; if(n!=0) ss.push(make_pair(dp[idi][idj][n+1]-dp[n_idi][n_idj] ,jilu[idi].id)); else ss.push(make_pair(dp[idi][idj][n+1],jilu[idi].id)); idi=n_idi;idj=n_idj; } puts("YES"); while(!ss.empty()){ pair<unsigned long long,int>t=ss.top(); ss.pop(); printf("%d %I64u\n",t.second,t.first); } }
相关文章推荐
- LeetCode 016 3Sum Closest
- 汇总内表数据:at end of方法和collect方法
- x264 参数详解【很强大、很细致,不再为不懂啥意思很烦恼】
- shell从入门到放弃(上)
- x264参数 中文说明
- int,String,数组的默认值输出问题
- linux基础之bash特性
- Linux内核设计与实现 第十七章
- 添加搜索路径到FileUtils
- HDU 1317 XYZZY
- GridView添加网格线
- Android Studio开发环境变量配置
- android广播的使用方式
- x264编码指南——码率控制
- 请教一个问题:关于 webrtc 通信的问题
- 《Linux内核设计与实现》第17章读书笔记
- Django session 详解-part II-session
- js代码的调试
- java 中== equal hashcode()什么的之间的关系
- android dialog activity