题意:

有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是相对最少作业量的位移量。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct st{
  4. int id,c;
  5. unsigned long long a,b,num;
  6. };
  7. bool cmp(st a,st b){
  8. return a.c<b.c;
  9. }
  10. st jilu[];
  11. unsigned long long dp[][][];
  12. int fi[][][],fj[][][];
  13. stack<pair<unsigned long long,int> >ss;
  14. int main()
  15. {
  16. int n,m;
  17. unsigned long long kk;
  18. scanf("%d%d%I64u",&n,&m,&kk);
  19. for(int i=;i<m;i++){
  20. int tmp;
  21. scanf("%I64u%I64u%d",&jilu[i].a,&jilu[i].b,&jilu[i].c);
  22. jilu[i].num=jilu[i].b-jilu[i].a;
  23. jilu[i].id=i+;
  24. }
  25. sort(jilu,jilu+m,cmp);
  26. for(int i=;i<m;i++){
  27. for(int k=;k<=n;k++){
  28. for(int j=;j<=jilu[i].num;j++){
  29. if(i==){
  30. if(k==)
  31. dp[i][j][k]=j+jilu[i].a;
  32. }
  33. else if(k==){
  34. dp[i][j][k]=j+jilu[i].a;
  35. }
  36. else{
  37. long long t=jilu[i].a+j-kk;
  38. for(int w=;w<i;w++){
  39. if(jilu[w].c>=jilu[i].c)break;
  40. if(jilu[w].a>t||jilu[w].b<t)continue;
  41. long long tt=t-jilu[w].a;
  42. if(dp[w][tt][k-]){
  43. if(dp[i][j][k]<jilu[i].a+j+dp[w][tt][k-]){
  44. dp[i][j][k]=jilu[i].a+j+dp[w][tt][k-];
  45. fi[i][j][k]=w;
  46. fj[i][j][k]=tt;
  47. }
  48. }
  49. }
  50. t=jilu[i].a+j;
  51. if(t%kk==){
  52. t/=kk;
  53. for(int w=;w<i;w++){
  54. if(jilu[w].c>=jilu[i].c)break;
  55. if(jilu[w].a>t||jilu[w].b<t)continue;
  56. long long tt=t-jilu[w].a;
  57. if(dp[w][tt][k-]){
  58. if(dp[i][j][k]<jilu[i].a+j+dp[w][tt][k-]){
  59. dp[i][j][k]=jilu[i].a+j+dp[w][tt][k-];
  60. fi[i][j][k]=w;
  61. fj[i][j][k]=tt;
  62. }
  63. }
  64. }
  65. }
  66. }
  67. }
  68. }
  69. }
  70. long long ans=;
  71. int idi,idj;
  72. for(int i=;i<m;i++){
  73. for(int j=;j<=jilu[i].num;j++){
  74. if(ans<dp[i][j][n]){
  75. ans=dp[i][j][n];
  76. idi=i;
  77. idj=j;
  78. }
  79. }
  80. }
  81. if(ans==){
  82. puts("NO");
  83. return ;
  84. }
  85. while(n--){
  86. int n_idi=fi[idi][idj][n+];
  87. int n_idj=fj[idi][idj][n+];
  88. if(n!=)
  89. ss.push(make_pair(dp[idi][idj][n+]-dp[n_idi][n_idj][n],jilu[idi].id));
  90. else
  91. ss.push(make_pair(dp[idi][idj][n+],jilu[idi].id));
  92. idi=n_idi;idj=n_idj;
  93. }
  94. puts("YES");
  95. while(!ss.empty()){
  96. pair<unsigned long long,int>t=ss.top();
  97. ss.pop();
  98. printf("%d %I64u\n",t.second,t.first);
  99. }
  100. }

Codeforces 119C DP的更多相关文章

  1. Two Melodies CodeForces - 813D (DP,技巧)

    https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #in ...

  2. Consecutive Subsequence CodeForces - 977F(dp)

    Consecutive Subsequence CodeForces - 977F 题目大意:输出一序列中的最大的连续数列的长度和与其对应的下标(连续是指 7 8 9这样的数列) 解题思路: 状态:把 ...

  3. codeforces的dp专题

    1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个 ...

  4. Codeforces 721C [dp][拓扑排序]

    /* 题意:给你一个有向无环图.给一个限定t. 问从1点到n点,在不超过t的情况下,最多可以拜访几个点. 保证至少有一条路时限不超过t. 思路: 1.由无后向性我们可以知道(取决于该图是一个DAG), ...

  5. CodeForces 607C (DP) Hard problem

    题目:这里 题意:给定n个字符串,每个字符串可以进行一项操作,就是将这个字符串交换,就是该字符串的第一个和最后一个交换,第二个和倒数第二个交换,以此类推,当然可以选择对于 该字符串进行或不进行这项操作 ...

  6. Codeforces 611d [DP][字符串]

    /* 题意:给一个长度不超过5000的字符串,每个字符都是0到9的数字. 要求将整个字符串划分成严格递增的几个数字,并且不允许前导零. 思路: 1.很开心得发现,当我在前i个区间以后再加一个区间的时候 ...

  7. Codeforces 404D [DP]

    /* 我是一个习惯后悔,但是没办法忍受内疚感的二货== 这题是个无脑dp,但是比赛大概20min没出...其实最后5min我好好想想简单化边界条件,可以出的. 题意: 给你一个长度为1e6的由?*01 ...

  8. Codeforces 1096F(dp + 树状数组)

    题目链接 题意: 对于长度为$n$的排列,在已知一些位的前提下求逆序对的期望 思路: 将答案分为$3$部分 $1.$$-1$与$-1$之间对答案的贡献.由于逆序对考虑的是数字之间的大小关系,故假设$- ...

  9. Codeforces 354B dp Game with Strings dp

    Game with Strings 题意并不是在图上走,看了好久才看出来.. dp[ i ][ mask ]表示从 i 层开始走,起点有mask个, a的个数-b的个数的  最大值或者最小值. #in ...

随机推荐

  1. 【转】VS2012程序打包部署详解

    上篇博客把收费系统的总体设计进行了一遍讲解,讲解的同时掺杂了些有关.NET编译机制的总结.程序编写测试完成后接下来我们要做的是打包部署程序,但VS2012让人心痛的是没有了打包工具.不知道出于什么原因 ...

  2. linux vi 工具的使用

    linux vi 工具的使用 1.打开文件 vi filename 如果存在该文件,则打开,不存在,则删除 2. 进入vi后,按i建,可以输入内容, 按ESC 在按: ,输入wq保存并退出. 3.移动 ...

  3. Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法

    Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法 昨天在开发的时候遇到个小问题,就是如何将Grid的内容与Form一起发送到服务器端.默认情况下,表单(F ...

  4. MS CRM 2011的自定义和开发(11)——插件(plugin)开发(三)

    http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2340661.html MS CRM 2011的自定义和开发(11)——插件(plugin ...

  5. 【转】JDBC为什么要使用PreparedStatement而不是Statement

    http://www.importnew.com/5006.html PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement.PreparedSta ...

  6. request的生命周期

    有如下功能: 从index.jsp页面点击超链接进入TestServlet服务器,TestServlet服务器再请求转发到test.jsp. 在index.jsp里设置了request的attribu ...

  7. 指定WebService访问的语言

    场景: 在访问ERP发布的WebService时,由于其指定了访问语言,导致不指定访问语言时,会有部分数据丢失. 解决: 通过WSDL工具生成代理类后,再次对其中的GetWebRequest方法进行重 ...

  8. ADF_General JSF系列1_创建一个简单的JSF Application

    2015-02-17 Creatd By BaoXinjian

  9. Hibernae 的延迟加载

    http://blog.csdn.net/xc635960736/article/details/7049863 Hibernae 的延迟加载   Hibernae 的延迟加载是一个非常常用的技术,实 ...

  10. Error: L6218E: Undefined symbol TIM_ARRPreloadConfig (referred from pwm_output.o).

    出错原因:模板FWLIB中没有添加stm32f10x_tim.c文件.添加即可 一般利用库开发,将ppp.c(ppp.c又调用了库stm32f10x_xx.h)写好之后的调用步骤: 1 将ppp.c和 ...