题意:

有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[];
unsigned long long dp[][][];
int fi[][][],fj[][][];
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=;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+;
}
sort(jilu,jilu+m,cmp);
for(int i=;i<m;i++){
for(int k=;k<=n;k++){
for(int j=;j<=jilu[i].num;j++){
if(i==){
if(k==)
dp[i][j][k]=j+jilu[i].a;
}
else if(k==){
dp[i][j][k]=j+jilu[i].a;
}
else{
long long t=jilu[i].a+j-kk;
for(int w=;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-]){
if(dp[i][j][k]<jilu[i].a+j+dp[w][tt][k-]){
dp[i][j][k]=jilu[i].a+j+dp[w][tt][k-];
fi[i][j][k]=w;
fj[i][j][k]=tt;
}
}
}
t=jilu[i].a+j;
if(t%kk==){
t/=kk;
for(int w=;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-]){
if(dp[i][j][k]<jilu[i].a+j+dp[w][tt][k-]){
dp[i][j][k]=jilu[i].a+j+dp[w][tt][k-];
fi[i][j][k]=w;
fj[i][j][k]=tt;
}
}
}
}
}
}
}
}
long long ans=;
int idi,idj;
for(int i=;i<m;i++){
for(int j=;j<=jilu[i].num;j++){
if(ans<dp[i][j][n]){
ans=dp[i][j][n];
idi=i;
idj=j;
}
}
}
if(ans==){
puts("NO");
return ;
}
while(n--){
int n_idi=fi[idi][idj][n+];
int n_idj=fj[idi][idj][n+];
if(n!=)
ss.push(make_pair(dp[idi][idj][n+]-dp[n_idi][n_idj][n],jilu[idi].id));
else
ss.push(make_pair(dp[idi][idj][n+],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);
}
}

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. 认识js函数对象(Function Object)

    认识函数对象(Function Object) 可以用function关键字定义一个函数,对于每个函数可以为其指定一个函数名,通过函 数名来进行调用.这些都是代码给用户的印象,而在JavaScript ...

  2. 文字对齐之text-align总结

    一.文字对齐总结: 下面是我实际运用中遇到的问题总结: css代码: 效果(段落文字没有对齐): 去掉html中的<p>标签,css样式同样去掉p标签,效果如下(达到预期效果): 为什么在 ...

  3. 剑指offer系列21--二叉搜索树的后续遍历序列

    * 21[题目]输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果. * 如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. * [注]二叉搜索树特点:左子树比根结 ...

  4. php 获取中文的拼音

    注意事项: 无法识别的中文 亳:bo,如果有此字,结果为空,调用此类之前需要手动加判断 蚌:bang,beng,多音字 莞:guan 圳:zhen 儋:dan 漯:luo 濮:pu 泸:lu 衢:qu ...

  5. 简单实例讲解linux的module模块编译步骤

    注:原博文地址http://blog.sina.com.cn/s/blog_4ba5b45e0102v25h.html ---------------------------------------- ...

  6. web开发

    教程 html教程 CSS 教程 JavaScript 教程 参考手册 HTML 4.01 / XHTML 1.0 参考手册 CSS 参考手册 JavaScript 参考手册 PHP 手册 CodeI ...

  7. Learning Core Data 1

    What is Core Data? If you want to build anything beyond the most simplistic apps for iOS, you’ll nee ...

  8. (C/C++) Interview in English - Threading

    Q. What's the process and threads and what's the difference between them? A.  A process is an execut ...

  9. C# new 和 override.

    http://www.dotblogs.com.tw/skychang/archive/2012/05/10/72114.aspx?fid=60865

  10. Unable to locate Android SDK used by project

    Unable to locate Android SDK used by project: DJIgojava.lang.RuntimeException: Unable to locate Andr ...