首页 > 其他分享 >洛谷题单指南-前缀和差分与离散化-P1314 [NOIP2011 提高组] 聪明的质监员

洛谷题单指南-前缀和差分与离散化-P1314 [NOIP2011 提高组] 聪明的质监员

时间:2024-07-25 17:44:38浏览次数:15  
标签:NOIP2011 int 洛谷题 矿石 sv long mid P1314 sc

原题链接:https://www.luogu.com.cn/problem/P1314

题意解读:计算m个检验值之和,计算与s差值绝对值的最小值。

解题思路:

1、首先要搞懂检验值是如何计算的

如上图,对于每一个区间的检验值yi,表示为:yi = "该区间重量>=W的矿石个数"  ✖️ "该区间>=W的矿石价值之和"

检验值y即所有yi(1<=i<=m)之和。

要快速计算l ~ r区间里>=W的矿石个数,以及l ~ r区间里>=W的矿石价值之和,可以借助前缀和。

2、W和检验值y的关系

W越大,符合>=W的矿石就越少,因此y值会越小,可以看出,W与y之间具有单调性,所以可以采用二分W来求y >= s的最小的y,进而计算|y-s|。

3、完整流程

第一步:二分W的值mid

第二步:针对W,计算前缀和数组sc、sv,sc[i]表示前i个矿石里重量>=W的个数,sv[i]表示前i个矿石里重量>=W的价值之和

第三步:计算检测值y,如果y>=s,往更大范围搜l = mid + 1,否则r = mid - 1

第四步:更新答案,这里要注意是计算|y-s|的最小值

当y>=s时,应该增大W,使得|y-s|更小

当y<s时,应该缩小W,使得|y-s|更小

因此,不管y>=s还是y<s,都应该更新一次答案。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 200005;

int n, m;
long long s, ans = 1e18;
int w[N], v[N], l[N], r[N];
long long sc[N], sv[N];

bool check(int W)
{
    //计算前缀和sc,sv
    //memset(sc, 0, sizeof(sc));
    //memset(sv, 0, sizeof(sv));
    for(int i = 1; i <= n; i++)
    {
        if(w[i] >= W)
        {
            sc[i] = sc[i - 1] + 1;
            sv[i] = sv[i - 1] + v[i];
        } 
        else
        {
            sc[i] = sc[i - 1];
            sv[i] = sv[i - 1];
        } 
    }
    //计算检验值y
    long long y = 0;
    for(int i = 1; i <= m; i++)
    {
        y += (sc[r[i]] - sc[l[i] - 1]) * ((sv[r[i]] - sv[l[i] - 1]));
    }
    //注意不管y>=s还是y<s,都应该更新答案
    ans = min(ans, abs(y - s));
    //判断检验值
    if(y >= s) return true;
    else return false;
}

int main()
{
    cin >> n >> m >> s;
    for(int i = 1; i <= n; i++) cin >> w[i] >> v[i];
    for(int i = 1; i <= m; i++) cin >> l[i] >> r[i];

    int left = 1, right = 1e9; 
    while(left <= right)
    {
        int mid = left + right >> 1;
        if(check(mid)) left = mid + 1;
        else right = mid - 1;
    }
    cout << ans;
    return 0;
}

 

标签:NOIP2011,int,洛谷题,矿石,sv,long,mid,P1314,sc
From: https://www.cnblogs.com/jcwy/p/18323778

相关文章

  • 洛谷题单指南-前缀和差分与离散化-P8218 【深进1.例1】求区间和
    原题链接:https://www.luogu.com.cn/problem/P8218题意解读:对于数组a[N],给定m个区间l~r,求每个区间所有元素之和。解题思路:先思考暴力做法:对于每一个区间[l,r],累加a[l]~a[r]所有元素,时间复杂度最坏为10^5*10^4,不可行。一维前缀和:设s[N]是a[N]的前缀和数组,即对于每一个s[i......
  • [NOIP2008 提高组] 笨小猴(洛谷题号P1125)
    [NOIP2008提高组]笨小猴题目描述笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的......
  • [NOIP2011 提高组] 聪明的质检员
    [NOIP2011提高组]聪明的质检员题目描述小T是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有\(n\)个矿石,从\(1\)到\(n\)逐一编号,每个矿石都有自己的重量\(w_i\)以及价值\(v_i\)。检验矿产的流程是:给定$m$个区间\([l_i,r_i]\);选出一个参数\(W\);对......
  • 洛谷P1308 [NOIP2011 普及组] 统计单词数C语言
    #include<stdio.h>#include<string.h>#include<ctype.h>intmain(){charcheck[11];charstr[1000001];intf_num=0;intcount=0;inti=0;intj=0;intp=1;gets(check);gets(str);......
  • [NOIP2011 提高组] 聪明的质监员
    [NOIP2011提高组]聪明的质监员题目描述小T是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有\(n\)个矿石,从\(1\)到\(n\)逐一编号,每个矿石都有自己的重量\(w_i\)以及价值\(v_i\)。检验矿产的流程是:给定$m$个区间\([l_i,r_i]\);选出一个参数\(W\);对......
  • CSP历年复赛题-P1310 [NOIP2011 普及组] 表达式的值
    原题链接:https://www.luogu.com.cn/problem/P1310题意解读:+代表按位或运算,*代表按位与运算,给定一个没有填数字的表达式,要求结果为0的数字方案数。解题思路:下面一步一步,由浅入深的来解决本题思路一(20分做法):观察得知,20%的数据,只有10个符号,且没有括号,也就是对应数字最多11个,可以......
  • CSP历年复赛题-P1308 [NOIP2011 普及组] 统计单词数
    原题链接:https://www.luogu.com.cn/problem/P1308题意解读:给定单词a,文本b,在b中找a的个数,并找a第一次出现的位置,注意b中任何位置可能含有多个连续空格。解题思路:通过双指针找b中每一个单词的首、尾位置i,j,与a进行一一比较即可。注意1:比较时不考虑大小写,可以统一转成小写字符tolo......
  • # [NOIP2011 提高组] 铺地毯
    传送锚点:https://www.luogu.com.cn/problem/P1003题目描述为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有\(n\)张地毯,编号从\(1\)到\(n\)。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后......
  • 洛谷题单指南-动态规划3-P1220 关路灯
    原题链接:https://www.luogu.com.cn/problem/P1220题意解读:按坐标顺序排列1~n个路灯,每个路灯有不同的功耗,老张从位置c开始关灯,第一时间关掉c位置的灯,每次关掉一个灯之后,可以往右走、也可以往左走关下一个灯,老张速度是1m/s,求所有灯都关掉所消耗的最少功耗。解题思路:由题意分析,关......
  • 洛谷题单指南-动态规划3-P4342 [IOI1998] Polygon
    原题链接:https://www.luogu.com.cn/problem/P4342题意解读:环中节点表示数字,边表示运算符,可以任意断一条边,其余节点两两按边的符号计算,求结果的最大值,以及最大值是断开那些边可以得到。解题思路:题意中有几个个关键信息:环形,节点数为n,边数为n任意断一条边,即可以从任意节点开始,......