首页 > 其他分享 >每日一题 聪明的质检员

每日一题 聪明的质检员

时间:2024-10-27 12:46:34浏览次数:6  
标签:前缀 int prev1 每日 mid 200010 聪明 质检员 prev2

        第一道绿题,第一发就过了70%(QAQ泪目),剩下都超时了,不知道该怎么优化了,看了解析,才知道需要使用前缀和。太妙了,题说给m个区间,n个矿石,要求这m个区间y的值的和,可以直接算从1到n的和,然后使用prev1[r[j]]-prev1[l[j]-1]算出各个区间和。

代码:

#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
int n,m,s;
int w[200010],v[200010],l[200010],r[200010];
//int prev1[200010]={0},prev2[200010]={0};
int y_is(int W)
{
    int h=0,s1=0,s2=0;
    // for(int j=1;j<=m;j++){
    //     s1=0,s2=0;
    // for(int i=l[j];i<=r[j];i++)
    // {
    //     if(w[i]>=W)
    //     {s1+=1;s2+=v[i];}
    // }
    
    // h+=(s1*s2);
    // //cout<<h<<"\n";
    // }
    int prev1[200010]={0},prev2[200010]={0};
        
            for(int j=1;j<=n;j++)
            {
                if(w[j]>=W)
                {prev1[j]=prev1[j-1]+1;
                prev2[j]=prev2[j-1]+v[j];
            }
            else{
                prev1[j]=prev1[j-1];
                prev2[j]=prev2[j-1];
            }
            }
            for(int j=1;j<=m;j++)
            {
                h+=(prev1[r[j]]-prev1[l[j]-1])*(prev2[r[j]]-prev2[l[j]-1]);
            }
    return h;
}
signed 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 max=w[0],min=w[0];
    for(int i=1;i<=n;i++)
    {
        if(max<w[i])
        max=w[i];
        if(min>w[i])
        min=w[i];
    }
    int i=min-1,j=max+1;
    while(i+1!=j)
    {
        int mid=(i+j)/2;
        if(y_is(mid)<=s)j=mid;
        else i=mid;
    }
    int x=abs(y_is(i)-s),y=abs(y_is(j)-s);
    if(x<y)
    cout<<x;
    else cout<<y;

    //cout<<"aa"<<y_is(4);
    // int *b,*c;
    // b=max_element(w,w+n);
    // c=min_element(w,w+n);
}

要注意的点:

1、发现把前缀和的初始化放在子函数里和子函数外都ac了,发现计算前缀和时,是从prev[0]开始计算的,而prev[0]恒等于0!所以每次计算都会重新赋值,prev初始化在该函数外也不怕叠加,会被覆盖,所以以后计算前缀和要从下标为1开始,下标为0的初值设置为0。

2、再就是二分判断的条件要想明白,如果y小于s,就说明W设置的太大了,需要往左边找(r=mid)

标签:前缀,int,prev1,每日,mid,200010,聪明,质检员,prev2
From: https://blog.csdn.net/m0_73997108/article/details/143266944

相关文章

  • 每日OJ题_牛客_城市群数量_FloodFill_C++_Java
    目录牛客_城市群数量_BFS/并查集题目解析C++代码Java代码牛客_城市群数量_BFS/并查集城市群数量_牛客题霸_牛客网(nowcoder.com)描述:        给定一个n个节点的邻接矩阵m。节点定义为城市,如果a城市与b城市相连,b与c城市相连,尽管a与c并不直接......
  • 高级java每日一道面试题-2024年10月24日-JVM篇-说一下JVM有哪些垃圾回收器?
    如果有遗漏,评论区告诉我进行补充面试官:说一下JVM有哪些垃圾回收器?我回答:1.Serial收集器特点:Serial收集器是最古老、最稳定的收集器,它使用单个线程进行垃圾收集工作。在进行垃圾回收时,它会暂停所有用户线程,即StopTheWorld(STW)。单线程工作,适合单核CPU。在年......
  • 高级java每日一道面试题-2024年10月23日-JVM篇-说一下JVM有哪些垃圾回收算法?
    如果有遗漏,评论区告诉我进行补充面试官:说一下JVM有哪些垃圾回收算法?我回答:在Java虚拟机(JVM)中,垃圾回收(GarbageCollection,GC)是一项非常重要的功能,用于自动管理应用程序的内存。JVM采用多种垃圾回收算法来决定何时以及如何回收不再使用的对象所占用的内......
  • leetcode每日一题:3181.执行操作可获得的最大总奖励 II
     题干:读本文前,请先弄懂上一篇中的内容,因为这是对上一篇内容的优化:3180.执行操作可获得的最大总奖励I明白上篇的,访问值的影响、复制、上下行之间的关系和算法后可继续看:上一篇中,我们用二维数组,第二维表示了状态空间。但是,在今日的题目中,提交不行,因为占用的空间太太太......
  • 力扣每日一题3181.执行操作可获得的最大总奖励2
      题目描述:给你一个整数数组 rewardValues,长度为 n,代表奖励的值。最初,你的总奖励 x 为0,所有下标都是 未标记 的。你可以执行以下操作 任意次 :从区间 [0,n-1] 中选择一个 未标记 的下标 i。如果 rewardValues[i] 大于 你当前的总奖励 x,则将 rewardVa......
  • sicp每日一题[2.58]
    Exercise2.58Supposewewanttomodifythedifferentiationprogramsothatitworkswithordinarymathematicalnotation,inwhich+and*areinfixratherthanprefixoperators.Sincethedifferentiationprogramisdefinedintermsofabstractdata,we......
  • 每日OJ题_牛客_NC383主持人调度(一)_排序​_C++_Java
    目录牛客_NC383主持人调度(一)_排序题目解析C++代码Java代码牛客_NC383主持人调度(一)_排序主持人调度(一)_牛客题霸_牛客网(nowcoder.com)描述:        有n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第i 个活动的开始时间是starti ,第i 个活动......
  • 20241024每日一题洛谷P1012
    普及-洛谷P1012拼数设有n个正整数,a1a2a3......an将它们联接成一排,相邻数字首尾相接,组成一个最大的整数输入:第一行有一个整数,表示数字个数n第二行有n个整数,表示给出的n个整数ai输出:一个正整数,表示最大的整数可以考虑两种路线:使用sort函数编辑cmp参数进行字符串......
  • 2024-10-23-leetcode每日一题-构成整天的下标对数目 II
    题目描述给你一个整数数组 hours,表示以 小时 为单位的时间,返回一个整数,表示满足 i<j 且 hours[i]+hours[j] 构成 整天 的下标对 i, j 的数目。整天 定义为时间持续时间是24小时的 整数倍 。例如,1天是24小时,2天是48小时,3天是72小时,以此类推。......
  • 每日OJ题_牛客_DP10最大子矩阵_二维前缀和_C++_Java
    目录牛客_DP10最大子矩阵_二维前缀和题目解析C++代码Java代码牛客_DP10最大子矩阵_二维前缀和最大子矩阵_牛客题霸_牛客网(nowcoder.com)描述:        已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1*1)子矩......