P1314 聪明的质监员(题解)
题目
小 T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 \(n\) 个矿石,从 \(1\) 到 \(n\) 逐一编号,每个矿石都有自己的重量 \(w_i\) 以及价值 \(v_i\) 。检验矿产的流程是:
1 、给定 \(m\) 个区间 \([l_i,r_i]\);
2 、选出一个参数 \(W\);
3 、对于一个区间 \([l_i,r_i]\),计算矿石在这个区间上的检验值 \(y_i\):
\]
其中 \(j\) 为矿石编号。
这批矿产的检验结果 \(y\) 为各个区间的检验值之和。即:\(\sum\limits_{i=1}^m y_i\)
若这批矿产的检验结果与所给标准值 \(s\) 相差太多,就需要再去检验另一批矿产。小 T 不想费时间去检验另一批矿产,所以他想通过调整参数 \(W\) 的值,让检验结果尽可能的靠近标准值 \(s\),即使得 \(|s-y|\) 最小。请你帮忙求出这个最小值。
解析
这是一道比较清晰明了的二分答案。
可以看出整个式子的自变量是 \(W\),因变量是此时得到的 \(y\)。
那么就来判断是否可以运用二分来解,首先判断单调性:
当 \(W\) 比最轻的矿石质量还小时,所有的矿石都可以参与运算,计算出来的 \(y\) 必定最大。
当 \(W\) 比最重的矿石质量还大时,所有的矿石都不能参与运算,计算出来的 \(y\) 必定最小。
因此,\(W\) 越小,参与计算的数就越多,\(y\) 也就越大。
所以单调性出来了,我们就可以在区间内通过枚举 \(W\) 来得到答案了。
然后就 \(TLE\) 了……
优化
查看代码发现,二分部分肯定是不会有什么超时的地方,那就是 check 函数的问题了。
发现在每次计算过程中由于重复计算造成了大量的浪费,于是考虑用前缀和优化。
使用 sum_n[i] 来表示区间中合格部分数量,sum_v[i] 来记录区间中合格部分价值。
最后进行计算。
#include<iostream>
#include<algorithm>
#include<cstdio>
#define int long long
using namespace std;
int n,m,s;
int w[200500],v[200500];
int l[200500],r[200500];
int sum_n[200500],sum_v[200500];
long long ans = 0;
void init()
{
scanf("%lld%lld%lld",&n,&m,&s);
for(int i = 1;i <= n; i++)
scanf("%lld%lld",&w[i],&v[i]);
for(int i = 1;i <= m; i++)
scanf("%lld%lld",&l[i],&r[i]);
return ;
}
long long check(int W)
{
long long ans = 0;
for(int i = 1;i <= n; i++)
{
if( W > w[i] )// 要用前缀和,不然会炸掉!!!
{
sum_n[i] = sum_n[i-1];
sum_v[i] = sum_v[i-1];
}
else
{
sum_n[i] = sum_n[i-1] + 1;
sum_v[i] = sum_v[i-1] + v[i];
}
}
for(int i = 1;i <= m; i++)
{
long long a,b;
a = sum_v[r[i]] - sum_v[l[i]-1];
b = sum_n[r[i]] - sum_n[l[i]-1];
ans += a*b;
}
return ans;
}
long long _abs(long long a)
{
if( a > 0 )
return a;
return -a;
}
signed main()
{
init();
int left = 0,right = 1000000,mid;
while( left <= right )
{
mid = (left + right)>>1;
if( check(mid) > s )
left = mid + 1;
else
right = mid - 1;
}
ans = _abs(check(left) - s);
if( _abs(check(right) - s) < ans )
ans = _abs(check(right) - s);
printf("%lld",ans);
return 0;
}
总结
题总体来说并不算难,但细节仍需要注意。
例如在考试中,就很有可能会忘记前缀和优化的问题,导致失去 30 分。
还有一直存在的 long long 的问题,同样会影响数十分。
要注重时间复杂度,重视算法的优化。做题时一定要每道题计算时间复杂度,不然考场追悔莫及。
P1314 聪明的质监员(题解)的更多相关文章
- 洛谷P1314 聪明的质监员 题解
题目 聪明的质监员 题解 这道题和之前Sabotage G的那道题类似,都是用二分答案求解(这道题还要简单一些,不需要用数学推导二分条件,只需简单判断一下即可). 同时为了降低复杂度,肯定不能用暴力求 ...
- P1314 聪明的质监员(前缀和+二分)
P1314 聪明的质监员 显然可以二分参数W 统计Y用下前缀和即可. #include<iostream> #include<cstdio> #include<cstri ...
- 洛谷P1314 聪明的质监员
P1314 聪明的质监员 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: ...
- luogu P1314 聪明的质监员 x
P1314 聪明的质监员(至于为什么选择这个题目,可能是我觉得比较好玩呗) 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自 ...
- luoguP1314 聪明的质监员 题解(NOIP2011)
P1314 聪明的质监员 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include< ...
- Luogu P1314 聪明的质监员(二分+前缀和)
P1314 聪明的质监员 题意 题目描述 小\(T\)是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有\(n\)个矿石,从\(1\)到\(n\)逐一编号,每个矿石都有自己的重量\(w_i\) ...
- NOIP2011聪明的质监员题解
631. [NOIP2011] 聪明的质监员 ★★ 输入文件:qc.in 输出文件:qc.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 小 T 是一名质量监督 ...
- 【luogu P1314 聪明的质监员】 题解
题目链接:https://www.luogu.org/problemnew/show/P1314 二分答案 但是计算区间贡献的时候 直接暴力会挂 前缀和加速 #include <cstdio&g ...
- 『题解』洛谷P1314 聪明的质监员
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 小T是一名质量监督员,最近负责检验一批矿产的质量.这 ...
- 洛谷 P1314 聪明的质监员 —— 二分
题目:https://www.luogu.org/problemnew/show/P1314 显然就是二分那个标准: 当然不能每个区间从头到尾算答案,所以要先算出每个位置被算了几次: 不知为何自己第一 ...
随机推荐
- 彻底掌握Makeifle(三)
彻底掌握Makeifle(三) 前言 在前面的文章彻底掌握Makefile(一)和彻底掌握Makefile(二)当中,我们简要的介绍了一些常见的makefile使用方法,在本篇文章当中我们将继续介绍一 ...
- [基础] BS/CS 区别 Http/Https 区别 中间件请求
BS和CS的区别: 1.BS结构:Browser-Server-从浏览器到服务器,浏览器打开的所有内容都属于BS(三大主流浏览器Safari.Chrome和Firefo) 2.CS结构:Cli ...
- SSM整合以及相关补充
SSM整合以及相关补充 我们在前面已经学习了Maven基本入门,Spring,SpringMVC,MyBatis三件套 现在我们来通过一些简单的案例,将我们最常用的开发三件套整合起来,进行一次完整的项 ...
- kubernetes Tcp流量可视化
kubernetes Tcp流量可视化 使用k8spacket和grafana的node graph插件可以查看kubernetes pod的TCP相关信息,如connection.bytes.和du ...
- JUC(8)JMM
文章目录 1.JMM 2.volatile 3.单例模式 1.JMM Volatile是java虚拟机提供轻量级的同步机制 1.保证可见性 2.不保证原子性 3.禁止指令重排 什么是JMM java内 ...
- Doris开发手记4:倍速性能提升,向量化导入的性能调优实践
最近居家中,对自己之前做的一些工作进行总结.正好有Doris社区的小伙伴吐槽向量化的导入性能表现并不是很理想,就借这个机会对之前开发的向量化导入的工作进行了性能调优,取得了不错的优化效果.借用本篇手记 ...
- springMVC实现文件的上传和下载
文件的下载功能 @RequestMapping("/testDown")public ResponseEntity<byte[]> testResponseEntity ...
- ubuntu 安装anaconda3
ubuntu 安装anaconda3 官网:https://www.anaconda.com/ 下载:https://www.anaconda.com/products/individual#Down ...
- Codeforces Round #781(C. Tree Infection)
Codeforces Round #781 C. Tree Infection time limit per test 1 second memory limit per test 256 megab ...
- python 基本使用 异常判断
简单常用 isinstance 判断一个对象是否是一个已知的类型 arg=123 isinstance(arg, int) #输出True isinstance(arg, str) #输出False ...