题目内容

  • 已知有一个\(n\)层的水站:

    • \(W_i\)表示未操作之前第\(i\)层的已有水量;
    • \(L_i\)表示第\(i\)个水站能够维持或者储存的水的重量;
    • 表示在第\(P_i\)层进行减压放水操作所需的费用.
  • 被压减放水层所储存的所有水都将流向下一层。如果第\(i\)层的水量比\(L_i\)大,则这一层也会(自动)减压(不需要任何费用)。
  • 现在想要使最后一层减压(第\(n\)级),求最少的花费。这个任务现在交给了你。

输入格式

  • 每个输入的第一行包含一个自然数\(n(1\le n\le 150000)\)。
  • 接下来\(n\)行每行包含\(3\)个数\(W_i,L_i,P_i(0\le W_i,L_i,P_i\le 15000)\)。

输出格式

  • 第一行输出所需的最小费用。
  • 第二行若干个整数,从小到大输出必须减压的层的编号。

样例输入

3

1000 1000 1

0 1000 2

2 10 100

样例输出

3

1 2

样例解释

给第一层和第二层减压即可。

代码

枚举+剪枝

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=150000+10;
int n,temp;
int w[maxn],l[maxn],p[maxn];
ll ans;
vector<int> res,mem; void work(ll now){
mem.clear();
int x=now,tempw=w[now],tot=p[now],temp;
mem.push_back(now);
while(x<=n){
temp=w[++x]+tempw;
tempw=temp;
if(temp<=l[x]){
tot+=p[x];
mem.push_back(x);
}
if(tot>=ans)return;
}
if(tot<ans){
ans=tot;
res.clear();
for(int i=0;i<mem.size();i++){
res.push_back(mem[i]);
}
}
} int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&w[i],&l[i],&p[i]); ans=p[n];res.push_back(n); for(int i=1;i<n;i++)
work(i); printf("%lld\n",ans); for(int i=0;i<res.size();i++)
printf("%d ",res[i]); return 0;
}

二分+差分

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=150000+10;
const ll INF=1e15;
int n;
ll ans=INF;
int w[maxn],l[maxn],p[maxn];
int c[maxn],sum[maxn]; int main(){
scanf("%d",&n); for(int i=1;i<=n;i++){
scanf("%d%d%d",&w[i],&l[i],&p[i]);
sum[i]=sum[i-1]+w[i];
} for(int i=1;i<=n;i++){
int x=lower_bound(sum,sum+i+1,sum[i]-l[i])-sum;
x++;
c[x]+=p[i];
c[i+1]-=p[i];
} int temp; for(int i=1;i<=n;i++){
c[i]=c[i-1]+c[i];
if(ans>c[i]){
ans=c[i];
temp=i;
}
} printf("%lld\n",ans); int tot=0;
for(int i=temp;i<=n;i++){
tot+=w[i];
if(tot<=l[i])
printf("%d ",i);
}
return 0;
}

优先队列

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=150000+10;
const ll INF=1e15;
int n;
ll ans=INF;
int sum,num;
int w[maxn],l[maxn],p[maxn];
int s[maxn]; struct Node{
int sum,id;
bool operator < (const Node& x)const{
return x.sum<sum;
}
}; priority_queue<Node> q; int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&w[i],&l[i],&p[i]); for(int i=n;i>=1;i--)
s[i]=s[i+1]+w[i]; for(int i=n;i>=1;i--){
sum+=p[i];
while(!q.empty()){
Node t=q.top();
if(s[i]<=t.sum)break;
sum-=p[t.id];
q.pop();
}
Node cur;
cur.id=i;
cur.sum=l[i]+s[i+1];
q.push(cur);
if(ans>sum){
ans=sum;
num=i;
}
} printf("%lld\n",ans); sum = 0;
for(int i=num;i<=n;++i){
sum+=w[i];
if(sum<=l[i])printf("%d ",i);
} return 0;
}

线段树

参见林dalao代码,%%%。

学长:不要用数据结构

\(rvalue\):不要无脑用数据结构

\(rvalue\)太巨辣我被爆锤辣QAQ

【暑假集训】HZOI2019 水站 多种解法的更多相关文章

  1. 暑假集训day1 水题 乘法最大

    题目大意:有一个长度为N的字符串,要求用K个乘号将其分成K+1个部分,求各个部分相乘的最大值 输入:第一行输入N和K,第二行输入一个长度为N的字符串 算法分析 1. 这个题只是一个简单的dp(甚至连区 ...

  2. 暑假集训Day1 整数划分

    题目大意: 如何把一个正整数N(N长度<20)划分为M(M>=1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式. 输入格式: 第一行一个正整数T(T<= ...

  3. 2015UESTC 暑假集训总结

    day1: 考微观经济学去了…… day2: 一开始就看了看一道题目最短的B题,拍了半小时交了上去wa了 感觉自己一定是自己想错了,于是去拍大家都过的A题,十分钟拍完交上去就A了 然后B题写了一发暴力 ...

  4. 多种解法解决n皇后问题

    多种解法解决n皇后问题 0x1 目的 ​ 深入掌握栈应用的算法和设计 0x2 内容 ​ 编写一个程序exp3-8.cpp求解n皇后问题. 0x3 问题描述 即在n×n的方格棋盘上,放置n个皇后,要求每 ...

  5. 【BZOJ4555】求和(多种解法混合版本)

    [BZOJ4555]求和(多种解法混合版本) 题面 BZOJ 给定\(n\),求 \[f(n)=\sum_{i=0}^{n}\sum_{j=0}^{i}S(i,j)\times 2^j \times ...

  6. STL 入门 (17 暑假集训第一周)

    快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...

  7. 巴塞尔问题(Basel problem)的多种解法

    巴塞尔问题(Basel problem)的多种解法——怎么计算\frac{1}{1^2}+\frac{1}{2^2}+\frac{1}{3^2}+\cdots112+122+132+⋯ ? (PS:本 ...

  8. 暑假集训Day2 互不侵犯(状压dp)

    这又是个状压dp (大型自闭现场) 题目大意: 在N*N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. ...

  9. 【暑假集训】HZOI2019 Luogu P1006 传纸条 二三四维解法

    写三次丢失两次,我谔谔,以后再不在博客园先保存我就去死 题目内容 洛谷链接 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学被安排坐成一个\(m\)行.\(n\ ...

随机推荐

  1. Linux:crond(crontab)定时任务

    一..定义 Crond 是linux系统中用来定期执行命令或指定程序任务的一种服务或者软件.一般在安装完系统时,crond会默认存在. crond默认每分钟会检查系统中是否有需要执行的定时任务.如果有 ...

  2. 安卓自动化测试工具Monkey简单使用

    一.首先安装adb 地址:http://www.downza.cn/soft/219906.html安装到D盘下,安装的过程中自己注意下不要安装上全家桶.找到这个压缩包:解压到当前文件夹: 二.将ad ...

  3. 漏洞扫描工具acunetix破解安装步骤

    Acunetix 12破解版安装教程 下载地址: 链接:https://pan.baidu.com/s/1jsKkrhOcx_O7ib7FQ6pidw 提取码:pwdj 1.下载软件压缩包文件,首先点 ...

  4. [剑指Offer]66-构建乘积数组

    题目 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]A[1]...A[i-1]A[i+1]...A[n-1].不能使用除法. 题 ...

  5. JVM_02 类加载子系统

    JVM细节版架构图 本文针对Class Loader SubSystem这一块展开讲解类加载子系统的工作流程 类加载子系统作用 1.类加载子系统负责从文件系统或者网络中加载class文件,class文 ...

  6. ES6重度学习 demo实例

    let 与 const // 并非真正的常量 // const 的本质: const 定义的变量并非常量,并非不可变, // 它定义了一个常量引用一个值.使用 const 定义的对象或者数组,其实是可 ...

  7. 部署Go语言程序的N种方式

    部署Go语言项目 本文以部署 Go Web 程序为例,介绍了在 CentOS7 服务器上部署 Go 语言程序的若干方法. 独立部署 Go 语言支持跨平台交叉编译,也就是说我们可以在 Windows 或 ...

  8. centos7 yum安装redis及常用命令

    redis是什么 Redis是一种基于内存的数据结构存储,可持久化的日志型.Key-Value数据库.使用关系型数据库的站点达到一定并发量的时候,往往在磁盘IO上会有瓶颈,这时候配合redis就有一定 ...

  9. 【思维】The Four Dimensions of Thinking :长线思维的力量

    "经历过这些苦难之后,我拥抱了一种新的人生哲学,就是更多地关注在那些长期可以获得复利的小收获上,而不是那种频繁的短跑冲刺和精力消耗". 斯坦福教授,著名的心理学家Philip Zi ...

  10. 趣图:普通人讲故事 VS 程序员讲故事

      扩展阅读 趣图:我说自己菜 vs 大佬说自己菜 趣图:客户需求VS客户预算 趣图:在外行人眼中的程序员 如何处理前任程序员留下的代码 一个故事讲清楚NIO