题意:从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. [shell]如何测试shell脚本,保证正确

    如何用最快最有效的方式进行测试? 很多开发的习惯是,二话不说,写完/拿到,就跑一把,看看输入,输出,想要的操作是否完成,也就过了. 其实这是十分不严谨的,若是未经过QA,风险还是相当大的. 以下即sh ...

  2. DB缓存一致性

    直接硬核干货,去掉前戏. 方案大致说明 1:假设对redis中存在一对key,value的对应关系是 key=money,value=666 2:当修改线程修改key时先将key设置成value=66 ...

  3. jvm 线程状态

    NEW: Just starting up, i.e., in process of being initialized.NEW_TRANS: Corresponding transition sta ...

  4. [题解] [SDOI2017] 序列计数

    题面 题解 和 SDOI2015 序列统计 比较像 这个无非就是把乘改成了加, NTT 改成了 MTT 再加上了一个小小的容斥 : 拿所有方案减去不合法方案即可 Code #include <a ...

  5. CSS — 隐藏滚动条,依旧可以滚动

    公司的系统,在PC端可以管理我们的公众号,在发布模块页面时有一个预览功能,呈现页面在手机端的样式. 做法很简单,一会就完成了,但是在预览内容过长时手机外框会有一个滚动条,影响美观,于是就想把它去掉,有 ...

  6. Java同步数据结构之Map概述及ConcurrentSkipListMap原理

    引言 前面介绍了CopyOnWriteArraySet,本来接着是打算介绍ConcurrentSkipListSet,无耐ConcurrentSkipListSet的内部实现其实是依赖一个Concur ...

  7. SQL-W3School-高级:SQL DEFAULT 约束

    ylbtech-SQL-W3School-高级:SQL DEFAULT 约束 1.返回顶部 1. SQL DEFAULT 约束 DEFAULT 约束用于向列中插入默认值. 如果没有规定其他的值,那么会 ...

  8. java time

    package cn.itcast_04;       import java.text.SimpleDateFormat;   import java.util.Date;       public ...

  9. smarty获得当前url的方法分享

    http://{$smarty.server.SERVER_NAME}/{$smarty.server.REQUEST_URI} 注释: 复制代码代码如下: {$smarty.server.SERVE ...

  10. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_04-freemarker基础-基础语法种类

    注释 编译一些这个模板 我的IDEA里面,是重新编译 刷新页面 注释.插值.FTL.文本