题意:从m门课选出n个排到n天,每天一门,难度须递增,每门课对应着一个作业量Xi,且Xi = Xi-1 + k or Xi - Xi-1 * k,总作业量要尽可能大,问能否排布,若能排布,求方案。

思路:比赛时企图用DFS暴搜,无奈超时,尝试各种优化都没成功,赛后看了题解才知道是DP,同时也发现很多时候能用搜索解决的题目如果用DP会省下很多时间!

  建立一个三维DP数组,dp[i][j][k],i表示第i天,j表示第i天时排了第j门课,k表示选择的作业量为第j门课作业区间的左端点+k。需要注意的地方是还应建立pre数组来标记DP路径。

代码如下:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std; struct subject{
long long a,b;
int c,id;
bool operator<(subject& t){
return c<t.c;
}
}arr[];
struct route{
int addition,id;
route(){}
route(int x,int y):id(x),addition(y){}
}pre[][][],ending; int n,m,k;
long long dp[][][];//day/num/work bool makeDp(){
memset(dp,-,sizeof(dp));
for(int j=;j<=m;j++)
for(long long i=arr[j].a;i<=arr[j].b;i++){
dp[][j][i-arr[j].a]=i;
}
for(int i=;i<n;i++){
for(int j=i;j<=m&&m-j>=n-i;j++){
for(long long kk=arr[j].a;kk<=arr[j].b;kk++){
if(dp[i][j][kk-arr[j].a]==-)
continue;
for(int jj=j+;jj<=m;jj++){
if(arr[jj].c==arr[j].c)
continue;
if(k*kk>=arr[jj].a&&k*kk<=arr[jj].b){
if(dp[i+][jj][k*kk-arr[jj].a]<dp[i][j][kk-arr[j].a]+k*kk){
dp[i+][jj][k*kk-arr[jj].a]=dp[i][j][kk-arr[j].a]+k*kk;
pre[i+][jj][k*kk-arr[jj].a]=route(j,kk-arr[j].a);
}
}
if(k+kk>=arr[jj].a&&k+kk<=arr[jj].b){
if(dp[i+][jj][k+kk-arr[jj].a]<dp[i][j][kk-arr[j].a]+k+kk){
dp[i+][jj][k+kk-arr[jj].a]=dp[i][j][kk-arr[j].a]+k+kk;
pre[i+][jj][k+kk-arr[jj].a]=route(j,kk-arr[j].a);
}
}
}
}
}
}
long long flag=-;
for(int i=n;i<=m;i++){
for(long long j=arr[i].a;j<=arr[i].b;j++){
if(flag<dp[n][i][j-arr[i].a]){
flag=dp[n][i][j-arr[i].a];
ending=route(i,j-arr[i].a);
}
}
}
if(flag!=-)
return true;
return false;
} void findAns(bool x){
if(!x)
cout<<"NO";
else {
cout<<"YES\n";
vector<route> ans;
route ha=ending;
for(int i=n;i>=;i--){
ans.push_back(ha);
ha=pre[i][ha.id][ha.addition];
}
for(int i=n-;i>=;i--){
cout<<arr[ans[i].id].id<<" "<<arr[ans[i].id].a+ans[i].addition<<endl;
}
}
} int main(){
cin>>n>>m>>k;
for(int i=;i<=m;i++){
cin>>arr[i].a>>arr[i].b>>arr[i].c;
arr[i].id=i;
}
sort(arr+,arr++m);
findAns(makeDp());
return ;
}

By xxmlala

Education Reform(CodeForces-119C)【DP】的更多相关文章

  1. CodeForces 106C 【DP】

    题意: n g dough  m种商品? 每种有ai stuffing, 拿bi stuffing + ci dough -> di tugriks rest c0 dough -> d0 ...

  2. CodeForces 761C 【DP】

    总结:能这么DP就这么写! 多练位运算标记. #include<bits/stdc++.h> using namespace::std; const int N=55; const int ...

  3. Codeforces 358D【DP】

    思路:  dp[i][0] 代表取的时候左边没有 dp[i][1] 代表取的时候右边没有 dp[i][2] 代表取的时候左右都没有 dp[i][3] 代表取的时候左右都有 然后自己转移吧= =. 注意 ...

  4. CodeForces 13C【DP】

    题意: 给你n个数,每次只能让一个数+1,或者-1,目标是最终使这个序列构成一个非递减的序列: n是5e3,复杂度n^2内.值是1e9: 思路: 可以发现子结构是保证一个区间的非递减, 如果只是dp[ ...

  5. CodeForces 687C【DP】

    题意: 给你n个数,然后让这些数相加组合,然后在这些组合的数里可以再相加组合搞出给定 k,输出这些组合的数. 思路: DP. //在枚举到第i个coin的时,dp[i][j],i 肯定能被a[i]组合 ...

  6. CodeForces 429B【dp】

    题意: 在一个n*m的矩阵中有两只虫子,一只从左上角向右下角移动,另外一只从左下角向右上角移动. 要求: 1.第一只虫子每次只能向左或者向下移动一格,另外一只只能向上或者向右移动一格. 2.两只虫子的 ...

  7. [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】

    [CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...

  8. Kattis - honey【DP】

    Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...

  9. HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】

    HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...

  10. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

随机推荐

  1. Linux中查看和修改分区的uuid方便挂载使用

    查看硬盘UUID: 两种方法: ls -l /dev/disk/by-uuid blkid /dev/sda1 修改分区UUID: 1.修改分区的UUID Ubuntu 使用 uuid命令 生成新的u ...

  2. html2canvas原理

    html2canvas有2种模式,一种是利用foreignObject,一种是纯canvas绘制 1.foreignObject到canvas 步骤: 1.把要截图的dom克隆一份,过程中把getCo ...

  3. 使用Excel拼凑SQL语句

       快速将一列多行数据合并到一个单元格            EXCEL如何快速将一列多行数据合并到一个单元格,并加分隔符?这是批量处理由一线业务员统计的数据时的常用方法,尤其是当一列数据是wher ...

  4. CF1214C

    CF1214C 题意: 给你一个括号序列,问你时候能仅移动相邻的两个元素,使括号序列合法. 解法: 可以先考虑普通括号序列怎么做 这道题只交换相邻的两个元素,所以如果中间左括号和右括号的差值大于2时, ...

  5. 中国萌兔-月饼工厂流水线 -万圣节萌宠-月饼售罄后续-B站东予薏米

    B站(Blibli)up主,东予薏米.下面画的五只兔兔,两只狗狗,一只猫猫都是她家的 啊!有个会画画的主人真是幸福- 蹦迪的那个兔兔头昏脑胀,敷了冰袋和膏药哈哈哈哈,好可爱! 下班了下班了~今天真是太 ...

  6. insmod mknod

    insmod module 會在 /proc/devices/ 下產生 major number 及 device name ---------------------------- mknod 會使 ...

  7. 如何丧心病狂的使用python爬虫读小说

    写在前边 其实一直想入门python很久了,慕课网啊,菜鸟教程啊python的基础的知识被我翻了很多遍了,但是一直没有什么实践.刚好,这两天被别人一直安利一本小说<我可能修的是假仙>,还在 ...

  8. 国内it论坛

    社区是聚集一类具有相同爱好或者相同行业的群体,IT技术社区就是聚集了IT行业内的技术人,在技术社区可以了解到行业的最新进展,学习最前沿的技术,认识有相同爱好的朋友,在一起学习和交流. 技术社区一般有三 ...

  9. win10 Java JDK环境变量配置

    注意下载JDK 版本不需太高(百度一下jdk下载就好了)   第一步 我们首先打开win10电脑的资源管理器,快捷键win+E 然后选中此电脑,鼠标右键在弹出的菜单中选中属性的按钮 第二步 看到窗口的 ...

  10. 操作TreeView(咏南工作室)

    {*******************************************************}{                                           ...