首页 > 其他分享 >P1314 [NOIP2011 提高组] 聪明的质监员

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

时间:2024-11-18 23:29:15浏览次数:1  
标签:NOIP2011 质监 矿石 mid 检验 矿产 P1314 long 区间

题目

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

题目描述

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

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

其中 j 为矿石编号。

这批矿产的检验结果 y 为各个区间的检验值之和。即:

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

输入格式

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

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

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

输出格式

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

样例 #1

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

输出 #1

10

题解

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>

const int N = 2e5 + 10;
long long n, m, goal;  
int w[N], v[N], l[N], r[N];  // w 为矿石的重量,v 为矿石的价值,l 和 r 为区间的起始和结束位置
long long a[N], s[N];  // a 是存储前缀和的数组,s 是存储前缀和的矿石价值数组

using namespace std;

// 检查给定 W 值时的检验结果
long long check(int mid);

int main() {
    cin >> n >> m >> goal;
    
    // 输入矿石的重量和价值
    for(long long i = 1; i <= n; i++) {
        cin >> w[i] >> v[i];
    }

    // 输入区间的起始和结束位置
    for(long long i = 0; i < m; i++) {
        cin >> l[i] >> r[i];
    }

    // 二分查找的右边界是 w 的最大值 + 1
    long long l = 0, r = 1e6 + 1;
    
    while(l < r) {
        long long mid = l + r + 1 >> 1;
        if(check(mid) >= goal) {
            l = mid;  // 说明当前 W 值可以满足条件,继续尝试更大的 W
        } else {
            r = mid - 1;  // 如果不能满足目标值,尝试更小的 W
        }
    }

    // 输出最接近目标的结果,检查 l 和 r 对应的检验值差值
    cout << min(abs(check(r) - goal), abs(check(r + 1) - goal)) << endl;
}

// 计算给定 W 值时的检验值
long long check(int mid) {
    long long y = 0;

    // 更新前缀和数组
    for(long long i = 1; i <= n; i++) {
        if(w[i] >= mid) {
            a[i] = a[i - 1] + 1;  // 矿石重量大于等于 W,数量 +1
            s[i] = s[i - 1] + v[i];  // 矿石价值加上
        } else {
            a[i] = a[i - 1];
            s[i] = s[i - 1];
        }
    }

    // 计算所有区间的检验值
    for(long long i = 0; i < m; i++) {
        // 根据前缀和计算每个区间的检验值
        long long count = a[r[i]] - a[l[i] - 1];  // 区间内满足条件的矿石数量
        long long value_sum = s[r[i]] - s[l[i] - 1];  // 区间内满足条件的矿石的价值和
        y += count * value_sum;  // 计算检验值并累加
    }

    return y;
}

标签:NOIP2011,质监,矿石,mid,检验,矿产,P1314,long,区间
From: https://www.cnblogs.com/Xuxuan18/p/18553999

相关文章

  • P1314 [NOIP2011 提高组] 聪明的质监员
    P1314[NOIP2011提高组]聪明的质监员#[NOIP2011提高组]聪明的质监员题目描述小T是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有个矿石,从到逐一编号,每个矿石都有自己的重量以及价值。检验矿产的流程是:给定个区间;选出一个参数;对于一个区间,计......
  • 聪明的质监员
    [NOIP2011提高组]聪明的质监员题目描述小T是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有\(n\)个矿石,从\(1\)到\(n\)逐一编号,每个矿石都有自己的重量\(w_i\)以及价值\(v_i\)。检验矿产的流程是:给定$m$个区间\([l_i,r_i]\);选出一个参数\(W\);对......
  • luogu P1314 聪明的质监员
    [NOIP2011提高组]聪明的质监员题目描述小T是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有\(n\)个矿石,从\(1\)到\(n\)逐一编号,每个矿石都有自己的重量\(w_i\)以及价值\(v_i\)。检验矿产的流程是:给定$m$个区间\([l_i,r_i]\);选出一个参数\(W\);对......
  • CSP/信奥赛C++语法基础刷题训练(10):洛谷P1307:[NOIP2011 普及组] 数字反转
    CSP/信奥赛C++语法基础刷题训练(10):洛谷P1307:[NOIP2011普及组]数字反转题目描述给定一个整数NNN,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,......
  • 题解 洛谷 Luogu P1308 [NOIP2011 普及组] 统计单词数 C++
    题目传送门:P1308[NOIP2011普及组]统计单词数-洛谷|计算机科学教育新生态https://www.luogu.com.cn/problem/P1308getline() 会清除使当次getline() 终止的换行,而cin 不会因此cin 以换行终止,之后还需要getline()的话,需要用getchar() 吞换行Linux的一些相......
  • ChatGPT、Python和OpenCV支持下的空天地遥感数据识别与计算(地质监测、城市规划、农业
    在科技飞速发展的时代,遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究,空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。原文链接:ChatGPT、Python和OpenCV支持下的空天地遥感数据识别与计算(地质监测、城市规划、......
  • 基于stm32的水质监测检测物联网单片机软硬件设计毕业生系统
    (1)硬件端STM32F103C8T6:用于所有程序的中控和模块数据通信;0.96寸OLDE:用于显示当前当前ph值、当前tds值,最上方显示游泳池水质检测;蜂鸣器与LED:用于设备报警和状态提示;Wife模块:用于设备联网,实现远程APP查看;超声波模块:使用超声波测距,实时回传测定的水位线;按键模块:用于调整限值数据,......
  • [题解]P1311 [NOIP2011 提高组] 选择客栈
    P1311[NOIP2011提高组]选择客栈P6032选择客栈加强版只要\([l,r]\)区间之内存在一个\(i\)使得\(w[i]\lep\),这个区间就是符合条件的。所以我们遍历每一个元素\(i\),根据贪心的思想我们维护\([1,i]\)区间内满足\(w[i]\lep\)的最大\(i\),记为\(mp\)。对于每个元素\(i\),寻找\(......
  • P1307 [NOIP2011 普及组] 数字反转
    P1307[NOIP2011普及组]数字反转提交483.96k通过196.21k时间限制1.00s内存限制128.00MB提交答案加入题单做题计划(首页)个人题单团队题单保存题目提供者CCF_NOI难度入门历史分数0 提交记录  查看题解标签NOIp普及组2011 查看算法标签进入讨论版相关讨论......
  • 【题解】【模拟,字符串】—— [NOIP2011 普及组] 统计单词数
    【题解】【字符串】——[NOIP2011普及组]统计单词数[NOIP2011普及组]统计单词数题目描述输入格式输出格式输入输出样例输入#1输出#1输入#2输出#2提示1.思路解析2.AC代码[NOIP2011普及组]统计单词数通往洛谷的传送门题目描述一般的文本编辑器都有查找......