刷题总结——道路覆盖(ssoj)
题目:
题目描述
Tar 把一段凹凸不平的路分成了高度不同的 N 段(每一段相同高度),并用 H[i] 表示第 i 段高度。现在 Tar 一共有 n 种泥土可用,它们都能覆盖给定的连续的 k 个部分。
对于第 i 种泥土,它的价格为 C[i],可以使得区间 [i,min(n,i+k-1)] 的路段的高度增加 E[i]。
Tar 要设定一种泥土使用计划,使得使用若干泥土后,这条路最低的高度尽量高,并且这个计划必须满足以下两点要求:
(1)每种泥土只能使用一次。
(2)泥土使用成本必须小于等于 M 。
请求出这个最低的高度最高是多少。
输入格式
第一行为如上文所示的三个正整数:N,M,K。
接下来 N 行,每行3个如上文所示的正整数 H[i],E[i],C[i]。
输出格式
输出有且只有一个数字,为最底部分的高度的最大值。
样例数据 1
备注
【数据范围】
对于 30% 的数据:N≤20。
对于 100% 的数据:1≤K≤11;1≤N≤100;0≤M,H[i],E[i],C[i]≤1000000。
题解:
引用ssoj官网题解:
二分+DP
二分答案ans,问题转化为了判定性问题。判定的方法是:每个位置都能到达高度ans的最小费用cost是否<=M。
注意到1<=K<=11,也就是说对于第i个路段,能够提高它高度的泥土只有从第i-K个到第i个。于是使用状态压缩动态规划求cost。f[i][j]表示前i个路段通过泥土使用>=高度ans,且第i - k个到第i个的使用情况为二进制数j
注意位运算打括号!!!!!!!
注意dp初始化!!!!!
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=;
const int inf=1e+;
int n,m,k;
int h[N],e[N],c[N];
int bit[];
int dp[N][],g[];
bool jud[N];
inline int R()
{
int f=;
char c;
for(c=getchar();(c<''||c>'');c=getchar());
for(;c<=''&&c>='';c=getchar())
f=(f<<)+(f<<)+c-'';
return f;
}
inline int find(int x)
{
for(int i=k-;i>=;i--)
if(x>=bit[i]) return i;
}
inline bool work(int minn)
{
memset(dp,-,sizeof(dp));
dp[][]=;
memset(jud,false,sizeof(jud));
jud[]=true;
for(int i=;i<=n;i++)
{
if(!jud[i-])
return false;
g[]=;
int maxx=(i<k?bit[i]:bit[k]);
for(int j=;j<maxx;j++)
{
int temp;
if(j==) g[j]=;
else
{
temp=find(j);
g[j]=g[j-bit[temp]]+e[i-temp];
}
if(g[j]+h[i]<minn) continue;
if(dp[i-][j>>]==-&&dp[i-][(j>>)+bit[k-]]==-) continue;
if(dp[i-][j>>]==-)
temp=dp[i-][(j>>)+bit[k-]];
else
{
if(dp[i-][(j>>)+bit[k-]]==-)
temp=dp[i-][j>>];
else
temp=min(dp[i-][j>>],dp[i-][(j>>)+bit[k-]]);
}
dp[i][j]=temp+(j&)*c[i];
if(dp[i][j]>m) dp[i][j]=-;
else jud[i]=true;
}
}
return jud[n];
}
int main()
{
// freopen("a.in","r",stdin);
n=R(),m=R(),k=R();
for(int i=;i<=n;i++)
h[i]=R(),e[i]=R(),c[i]=R();
bit[]=;
for(int i=;i<=k;i++)
bit[i]=bit[i-]*;
int left=inf,right;
for(int i=;i<=n;i++)
left=min(left,h[i]);
right=h[]+e[];
for(int i=;i<=n;i++)
{
int temp=h[i];
for(int j=i;j>=i-k+&&j>=;j--)
temp+=e[j];
right=max(temp,right);
}
int ans=left;
while(left<=right)
{
int mid=(left+right)/;
if(work(mid)) ans=mid,left=mid+;
else right=mid-;
}
cout<<ans<<endl;
return ;
}
刷题总结——道路覆盖(ssoj)的更多相关文章
- 刷题总结——探险(ssoj)
题目: 国家探险队长 Jack 意外弄到了一份秦始皇的藏宝图,于是,探险队一行人便踏上寻宝之旅,去寻找传说中的宝藏. 藏宝点分布在森林的各处,每个点有一个值,表示藏宝的价值.它们之间由一些小路相连,小 ...
- 刷题总结——xor(ssoj)
题目: 题目背景 OURCE:NOIP2015-SHY-7 题目描述 求一棵带边权的树的一条最大 Xor 路径的值.这里的“路径”不一定从根到叶子结点,中间一段路径只要满足条件也可以. 输入格式 第一 ...
- 刷题总结——array(ssoj)
题目: 题目描述 给定 2 个正整数序列 A1, A2,序列长度分别为 L1, L2.你可以进行以下的一次操作:1. 选择两个数 K1,K2(1≤K1≤L1, 1≤K2≤L2):2. 移去 A1 中最 ...
- 刷题总结——蜥蜴(ssoj网络流)
题目: 题目背景 SCOI2007 DAY1 T3 题目描述 在一个 r 行 c 列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外.每行每列中相邻石柱的距 ...
- 刷题总结——选课(ssoj树形dp+记忆化搜索+多叉树转二叉树)
题目: 题目描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了 N(N<300)门的选修课程,每个学生可选课程的数量 M 是给定的.学生选修了这M门课 ...
- 刷题总结——字符串(ssoj)
题目: 给定n个小的字符串T和一个大的字符串S,先输出T总共再S中出现了多少次 然后q个询问···每次修改S上的一个字母,然后再次输出上述答案··· n小于1000,q<200000,T的总长度 ...
- 刷题总结——run(ssoj)
题目: 题目描述 企鹅国正在举办全面运动会,第一项比赛就是跑步.N 个人在圆形跑道上跑步,他们都有各自的速度和起点.但这个跑步规则很奇怪,当两个人相遇的时候编号较小的就会出局,当场上剩下最后一个人的时 ...
- 刷题总结——work(ssoj)
题目: 题目背景 SOURCE:NOIP2015-SHY-5 题目描述 假设现在离 noip 还有 m 天,有 n 个人要去参加比赛.他们每个人都有一个预定的训练量 r[i] ,所以每一天他们都抓紧时 ...
- 刷题总结——ball(ssoj)
题目: 题目背景 SOURCE:NOIP2015-SHY-9 题目描述 Alice 与 Bob 在玩游戏.他们一共玩了 t 轮游戏.游戏中,他们分别获得了 n 个和 m 个小球.每个球上有一个分数.每 ...
随机推荐
- codevs 3054 高精度练习-文件操作
时间限制: 1 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 输入一组数据,将每个数据加1后输出 输入描述 Input Descripti ...
- 将sql 查询结果导出到excel
在平时工作中经常会遇到,sql 查询数据之后需要发送给业务人员,每次都手工执行脚本然后拷贝数据到excel中,比较耗时耗力,可以考虑自动执行查询并将结果邮件发送出来. 分两步实现: 1.执行查询将结果 ...
- 使用python查询天气
python主代码 weather.py import urllib2 import json from city import city cityname = raw_input('你想查哪个城市的 ...
- Windows Dos命令下查看端口号,杀死端口
PS:本文以 Redis 默认端口 6379 为例 1,首先查询该端口的 pid,使用命令 [netstat -ano | findstr 端口号] F:\Program Files\Redi ...
- poj1142Smith Numbers质因子分解
题意:一个数不是质数,其质因子的每位加起来等于该数的每位加起来. /* 题意:一个数的所有质因子的每位相加起来等于该数的每位相加起来且该数不能是质数,那么就是史密斯数 tip:对于分解质因子,只需要判 ...
- flask--Django 基本使用
#导入flaskfrom flask import Flask #创建应用 app = Flask(__name__) #创建根路径视图 @app.route('/') def hello_world ...
- Vue之父子组件的通信
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Django-C003-视图
此文章完成度[5%]留着以后忘记的回顾.多写多练多思考,我会努力写出有意思的demo,如果知识点有错误.误导,欢迎大家在评论处写下你的感想或者纠错. 在这个章节中,我们也一样需要练习过往已经掌握的技能 ...
- IjkPlayer播放器秒开优化以及常用Option设置
https://blog.csdn.net/shareus/article/details/78585260 ijkplayer点播和直播视频 问题 解决及优化 https://blog.csdn. ...
- Luogu P3938 斐波那契
Luogu P3938 斐波那契 第一眼看到这题,想到的是LCA,于是开始想怎么建树,倒是想出了\(n^{2}\)算法,看了下数据范围,果断放弃 想了想这数据范围,大的有点不正常,这让我想起了当年被小 ...