P1314 [NOIP2011 提高组] 聪明的质监员

题目描述

`小T` 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 $n$ 个矿石,从 $1$ 到 $n$ 逐一编号,每个矿石都有自己的重量 $w_i$ 以及价值 $v_i$ 。检验矿产的流程是:

1. 给定$ m$ 个区间 $[l_i,r_i]$;
2. 选出一个参数 $W$;
3. 对于一个区间 $[l_i,r_i]$,计算矿石在这个区间上的检验值 $y_i$:

$$y_i=\sum\limits_{j=l_i}^{r_i}[w_j \ge W] \times \sum\limits_{j=l_i}^{r_i}[w_j \ge W]v_j$$  

其中 $j$ 为矿石编号。

这批矿产的检验结果 $y$ 为各个区间的检验值之和。即:$\sum\limits_{i=1}^m y_i$  

若这批矿产的检验结果与所给标准值 $s$ 相差太多,就需要再去检验另一批矿产。`小T` 不想费时间去检验另一批矿产,所以他想通过调整参数 $W$ 的值,让检验结果尽可能的靠近标准值 $s$,即使得 $|s-y|$ 最小。请你帮忙求出这个最小值。

输入格式

第一行包含三个整数 $n,m,s$,分别表示矿石的个数、区间的个数和标准值。

接下来的 $n$ 行,每行两个整数,中间用空格隔开,第 $i+1$ 行表示 $i$ 号矿石的重量 $w_i$ 和价值 $v_i$。

接下来的 $m$ 行,表示区间,每行两个整数,中间用空格隔开,第 $i+n+1$ 行表示区间 $[l_i,r_i]$ 的两个端点 $l_i$ 和 $r_i$。注意:不同区间可能重合或相互重叠。

输出格式

一个整数,表示所求的最小值。

## 样例 #1

### 样例输入 #1

```
5 3 15 
1 5 
2 5 
3 5 
4 5 
5 5 
1 5 
2 4 
3 3
```

### 样例输出 #1

```
10
```

## 提示

【输入输出样例说明】

当 $W$ 选 $4$ 的时候,三个区间上检验值分别为 $20,5 ,0$ ,这批矿产的检验结果为 $25$,此时与标准值 $S$ 相差最小为 $10$。

【数据范围】

对于 $10\% $ 的数据,有 $1 ≤n ,m≤10$;

对于 $30\% $的数据,有 $1 ≤n ,m≤500$ ;

对于 $50\% $ 的数据,有 $ 1 ≤n ,m≤5,000$;
 
对于 $70\%$ 的数据,有 $1 ≤n ,m≤10,000$ ;

对于 $100\%$ 的数据,有 $ 1 ≤n ,m≤200,000$,$0 < w_i,v_i≤10^6$,$0 < s≤10^{12}$,$1 ≤l_i ≤r_i ≤n$ 。

分析:这道题用到了前缀和以及二分查找的方法。

代码:

#include<bits/stdc++.h>
using namespace std;long long n, m, s;  // 定义长整型变量 n, m, s
long long w[200001] = {0};  // 定义长整型数组 w,初始化为 0
long long v[200001] = {0};  // 定义长整型数组 v,初始化为 0
long long l[200001] = {0};  // 定义长整型数组 l,初始化为 0
long long r[200001] = {0};  // 定义长整型数组 r,初始化为 0
long long sum_w[200001] = {0};  // 定义长整型数组 sum_w,初始化为 0
long long sum_v[200001] = {0};  // 定义长整型数组 sum_v,初始化为 0
long long mini = 1000000;  // 定义最小值,初始化为最大的长整型数值
long long maxi = -1;  // 定义最大值,初始化为 -1
long long result = 0;  // 定义结果,初始化为 0// 计算函数y,参数为长整型W,返回长整型值
long long y(long long W)
{long long ans = 0;  // 定义长整型变量 ans,初始化为 0memset(sum_v, 0, sizeof(sum_v));  // 用 0 填充 sum_v 数组memset(sum_w, 0, sizeof(sum_w));  // 用 0 填充 sum_w 数组for (long long i = 1; i <= n; i++)      //前缀和{// 根据w[i]的值判断是否累加sum_w和sum_v数组if (w[i] >= W){sum_w[i] = sum_w[i - 1] + 1;sum_v[i] = sum_v[i - 1] + v[i];}else{sum_w[i] = sum_w[i - 1];sum_v[i] = sum_v[i - 1];}}for (long long i = 1; i <= m; i++){// 根据sum_w和sum_v数组计算ans的值ans += (sum_w[r[i]] - sum_w[l[i] - 1]) * (sum_v[r[i]] - sum_v[l[i] - 1]);}return ans;  // 返回结果ans
}// 检查函数check,参数为长整型ans,返回布尔类型值
bool check(long long ans)
{result = llabs(ans - s);  // 计算result的值if (ans > s){return true;  // 如果ans大于s,返回true}else{return false;  // 如果ans不大于s,返回false}
}int main()
{cin >> n >> m >> s;  // 输入n, m, s的值for (long long i = 1; i <= n; i++){cin >> w[i] >> v[i];  // 输入w[i]和v[i]的值maxi = max(maxi, w[i]);  // 更新maxi的值mini = min(mini, w[i]);  // 更新mini的值}for (long long j = 1; j <= m; j++){cin >> l[j] >> r[j];  // 输入l[j]和r[j]的值}long long left = mini, right = maxi;  // 定义长整型变量left和right,分别赋值为mini和maxilong long mid;  // 定义长整型变量midlong long ans = 0x3f3f3f3f3f3f3f3f;  // 在计算机编程中,像"0x3f3f3f3f3f3f3f3f"这样的十六进制数字通常用作初始化数组或变量的初始值。这个值在算法竞赛和编程中被广泛使用,通常表示无穷大或者一个非常大的数,用于表示初始条件或者占位符。while (left <= right){mid = (right + left) / 2;  // 计算mid的值if (check(y(mid)))  // 调用check函数,传入y(mid)的值,如果返回true{left = mid + 1;  // 更新left的值,减小y(mid)的值,因为W增大了,矿石选的更少了。}else{right = mid - 1;  // 更新right的值}if (ans > result)  // 如果ans大于result{ans = result;  // 更新ans的值为result}}cout << ans << endl;  // 输出结果ansreturn 0;  // 返回0
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/136187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机丢失mfc100.dll如何恢复,详细解析mfc100.dll文件丢失解决方法

在计算机使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;比如“mfc100.dll丢失”。这是因为动态链接库&#xff08;DLL&#xff09;文件是Windows操作系统的重要组成部分&#xff0c;它们包含了许多程序运行所需的函数和数据。当这些DLL文件丢失或损坏时&#x…

在已有的虚拟环境中升级python版本

对于现有的虚拟环境&#xff0c;想升级python版本方法&#xff0c;试了无数的方法终于找对了。 1.首先activate对应的虚拟环境&#xff0c;然后输入下面的命令&#xff1a; conda install python3.8 建议加上镜像源 ​conda install python3.8 -i https://pypi.tuna.tsingh…

说话人识别声纹识别CAM++,ECAPA-TDNN等算法

参考:https://www.modelscope.cn/models?page=1&tasks=speaker-verification&type=audio https://github.com/alibaba-damo-academy/3D-Speaker/blob/main/requirements.txt 单个声纹比较可以直接modelscope包运行 from modelscope.pipelines import pipeline sv_pi…

pytest中的pytest.ini

[pytest] filterwarnings ignore::DeprecationWarning addopts -v -s markers uat:1 smok:2 log_cli1 xfail_strict True filterwarnings ignore::DeprecationWarning 这个的功能就是 test_login.py::Test_login::test_login_correct_password PASSEDwarnings summary …

推荐大学生考研党都来使用的白板笔记软件!上岸卷王必备!

考研这条路&#xff0c;对于很多大学生来说&#xff0c;是一条漫漫长路。相信很多人都有这样的体会&#xff1a;看了大量的书籍&#xff0c;记了大量的笔记&#xff0c;但是到了临近考试的时候&#xff0c;却发现复习的内容和思路都不是很清晰&#xff0c;效率不高。 针对这个…

算法通过村第十八关-回溯|白银笔记|经典问题

文章目录 前言组合总和问题分割回文串子集问题排序问题字母大小写全排列单词搜索总结 前言 提示&#xff1a;我不愿再给你写信了。因为我终于感到&#xff0c;我们的全部通信知识一个大大的幻影&#xff0c;我们每个人知识再给自己写信。 --安德烈纪德 回溯主要解决一些暴力枚举…

13 # 手写 concat 方法

concat 的使用 concat() 方法用于合并两个或多个数组。此方法不会更改现有数组&#xff0c;而是返回一个新数组。如果省略了所有参数&#xff0c;则 concat 会返回调用此方法的现存数组的一个浅拷贝。 <script>var arr1 ["k", "a", "i"…

2023年眼镜行业分析(京东眼镜销量数据分析):市场规模同比增长26%,消费需求持续释放

随着我国经济的不断发展&#xff0c;电子产品不断普及&#xff0c;低龄及老龄人口的用眼场景不断增多&#xff0c;不同年龄阶段的人群有不同的视力问题&#xff0c;因此&#xff0c;视力问题人口基数也随之不断加大&#xff0c;由此佩戴眼镜的人群也不断增多。 同时&#xff0c…

【凡人修仙传】预计开播倒计时,线下举办超前观影活动,隆重期待

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料凡人最新资讯&#xff0c;《凡人修仙传》这部备受期待的动漫作品&#xff0c;终于在新年之际宣布了定档日期。据悉&#xff0c;该动漫将于11月25日&#xff0c;也就是周六上午11点&#xff0c;与广大…

Linux搭建我的世界MC服务器 【Minecraft外网联机教程】

文章目录 前言1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 前言 Li…

SPASS-描述性统计

基本描述性统计量的定义及计算 描述集中趋势的统计量 1.均值(Mean) 2.众数(Mode) 3.中位数(Median) 4.总和(Sum) 5.百分位数(Percentile Value) 描述离散程度的统计量 1.样本方差(Variance) 2.样本标准差(Std. deviation) 3.极差(Range) …

vim以16进制打开和编辑文件

vim以16进制打开和编辑文件 先用 vim 以二进制格式打开需要编辑或查看的文件&#xff0c;不采用 - b 参数有时会导致转换错误&#xff0c;详见分隔线后部分。 vim -b file-to-open.dat 然后用 xxd 把文件转换成十六进制格式 :%!xxd转化后显示类似如下 现在就可以对待普通文…

多线程返回计时问题代码案例

Component Slf4j Async public class ThreadSaveDigCategory {private static final int BATCH_COUTN 1000;Autowiredprivate Mapper mapper;public Future<Boolean> saveDigCategoryDatas(List<DigCategoryData> digCategoryDataList){//开始计时long startTime …

通过创建自定义标签来扩展HTML

使用HTML时&#xff0c;例如&#xff0c;使用<b>标记显示粗体文本。 如果需要列表&#xff0c;则对每个列表项使用<ul>标记及其子标记<li> 。 标签由浏览器解释&#xff0c;并与CSS一起确定网页内容的显示方式以及部分内容的行为。 有时&#xff0c;仅使用一…

什么是前台、中台、和后台?

前台&#xff1a;即包括与用户直接交互的界面&#xff0c;如&#xff1a;web页、app&#xff1b;也包括服务端各种实时响应用户请求的业务逻辑&#xff0c;如&#xff1a;商品查询、订单系统等。 后台&#xff1a;面向内部运营人员的管理系统、配置系统&#xff0c;如&#xf…

Leetcode---370周赛

题目列表 2923. 找到冠军 I 2924. 找到冠军 II 2925. 在树上执行操作以后得到的最大分数 2926. 平衡子序列的最大和 一、找到冠军I 第一题模拟题&#xff0c;简单来说是看每一行(列)是否全是1&#xff0c;当然不包括自己比自己强的情况&#xff0c;需要特判 代码如下 …

QT线程的使用 QtConcurrent

QT线程的使用 QtConcurrent 1 .pro文件2 .h头文件3 .cpp源文件4 .ui文件5 效果6 优点1 .pro文件 QT += core gui concurrent2 .h头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H

在 uniapp 里面使用 unocss

1. 安装插件 npm i unocss unocss/transformer-directives unocss-preset-weapp -D 这个里面加了个指令的使用, 可以根据自身需求来决定是否使用 2. uno.config.ts 配置。 按照这个配置基本可以解决你的问题。 import presetWeapp from unocss-preset-weapp import { extra…

SpringCloudAlibaba——Sentinel

Sentinel也就是我们之前的Hystrix&#xff0c;而且比Hystrix功能更加的强大。Sentinel是分布式系统的流量防卫兵&#xff0c;以流量为切入点&#xff0c;从流量控制、流量路由、熔断降级等多个维度保护服务的稳定性。 Sentinel采用的是懒加载&#xff0c;这个接口被访问一次&a…

解决MySQL不能存储Emoji表情的问题

原因分析 在MySQL 5.5.3之前版本的数据库中&#xff0c;数据库的默认编码是utf8字符集&#xff0c;只支持1-3个字节的字符&#xff0c;也就是只能保存1到3个字节。但现在的emoji表情需要用4个字节才能保存&#xff0c;所以抛出异常。 解决方案 1、将数据表的编码格式设置成u…