Education Reform(CodeForces-119C)【DP】
题意:从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】的更多相关文章
- CodeForces 106C 【DP】
题意: n g dough m种商品? 每种有ai stuffing, 拿bi stuffing + ci dough -> di tugriks rest c0 dough -> d0 ...
- CodeForces 761C 【DP】
总结:能这么DP就这么写! 多练位运算标记. #include<bits/stdc++.h> using namespace::std; const int N=55; const int ...
- Codeforces 358D【DP】
思路: dp[i][0] 代表取的时候左边没有 dp[i][1] 代表取的时候右边没有 dp[i][2] 代表取的时候左右都没有 dp[i][3] 代表取的时候左右都有 然后自己转移吧= =. 注意 ...
- CodeForces 13C【DP】
题意: 给你n个数,每次只能让一个数+1,或者-1,目标是最终使这个序列构成一个非递减的序列: n是5e3,复杂度n^2内.值是1e9: 思路: 可以发现子结构是保证一个区间的非递减, 如果只是dp[ ...
- CodeForces 687C【DP】
题意: 给你n个数,然后让这些数相加组合,然后在这些组合的数里可以再相加组合搞出给定 k,输出这些组合的数. 思路: DP. //在枚举到第i个coin的时,dp[i][j],i 肯定能被a[i]组合 ...
- CodeForces 429B【dp】
题意: 在一个n*m的矩阵中有两只虫子,一只从左上角向右下角移动,另外一只从左下角向右上角移动. 要求: 1.第一只虫子每次只能向左或者向下移动一格,另外一只只能向上或者向右移动一格. 2.两只虫子的 ...
- [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】
[CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...
- Kattis - honey【DP】
Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
随机推荐
- [shell]如何测试shell脚本,保证正确
如何用最快最有效的方式进行测试? 很多开发的习惯是,二话不说,写完/拿到,就跑一把,看看输入,输出,想要的操作是否完成,也就过了. 其实这是十分不严谨的,若是未经过QA,风险还是相当大的. 以下即sh ...
- DB缓存一致性
直接硬核干货,去掉前戏. 方案大致说明 1:假设对redis中存在一对key,value的对应关系是 key=money,value=666 2:当修改线程修改key时先将key设置成value=66 ...
- jvm 线程状态
NEW: Just starting up, i.e., in process of being initialized.NEW_TRANS: Corresponding transition sta ...
- [题解] [SDOI2017] 序列计数
题面 题解 和 SDOI2015 序列统计 比较像 这个无非就是把乘改成了加, NTT 改成了 MTT 再加上了一个小小的容斥 : 拿所有方案减去不合法方案即可 Code #include <a ...
- CSS — 隐藏滚动条,依旧可以滚动
公司的系统,在PC端可以管理我们的公众号,在发布模块页面时有一个预览功能,呈现页面在手机端的样式. 做法很简单,一会就完成了,但是在预览内容过长时手机外框会有一个滚动条,影响美观,于是就想把它去掉,有 ...
- Java同步数据结构之Map概述及ConcurrentSkipListMap原理
引言 前面介绍了CopyOnWriteArraySet,本来接着是打算介绍ConcurrentSkipListSet,无耐ConcurrentSkipListSet的内部实现其实是依赖一个Concur ...
- SQL-W3School-高级:SQL DEFAULT 约束
ylbtech-SQL-W3School-高级:SQL DEFAULT 约束 1.返回顶部 1. SQL DEFAULT 约束 DEFAULT 约束用于向列中插入默认值. 如果没有规定其他的值,那么会 ...
- java time
package cn.itcast_04; import java.text.SimpleDateFormat; import java.util.Date; public ...
- smarty获得当前url的方法分享
http://{$smarty.server.SERVER_NAME}/{$smarty.server.REQUEST_URI} 注释: 复制代码代码如下: {$smarty.server.SERVE ...
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_04-freemarker基础-基础语法种类
注释 编译一些这个模板 我的IDEA里面,是重新编译 刷新页面 注释.插值.FTL.文本