首页 > 其他分享 >D 数组

D 数组

时间:2023-09-23 10:12:28浏览次数:35  
标签:满意度 int 元素 最小 队列 数组

二分查找+优先队列

先看要求:寻找r[i]值,使得在【i,r[i]】区间内数组A的和<=k[i]c[i],在【i,r[i]+1】数组A的和>k[i]c[i],且r[i]的取值在[i-1,n]
这个可以利用前缀和s数组来二分查找,寻找r[i]的值,利用函数upper_bounder(s+i,s+1+n,k[i]*c[i]+s[i-1])-s-1;

然后看满意度:满意度为B数组中最大元素-最小元素。
我们可以这么想,只要把最小元素变大,那么满意度就会变小,当然其间满意度可能会变大,我们取最小即可
很容易想到,我们可以利用优先队列存储B元素和它的下标,每次取出最小B元素使其变大即可
这样我们只需要维护最大值,然后减去优先队列里的最小值即可

不难想到,要让B[i]元素变大,我们需要让r[i]元素变大,要让r[i]元素变大,我们需要让k[i]*c[i]值变大,所以每次让c[i]++,即可。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int read(){//快读
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=x*10+c-'0';
        c=getchar();
    }
    return x*f;
}
#define LL long long
const int N=2e5+10;
int a[N],b[N],c[N],k[N],r[N];
LL s[N];//前缀和数组
int main(){
    int n=read(),m=read();
    for(int i=1;i<=n;i++) {
        a[i]=read();
        s[i]=s[i-1]+a[i];
    }    
    for(int i=1;i<=n;i++) k[i]=read();
    for(int i=1;i<=n;i++) c[i]=read();
    priority_queue<pair<int,int>> q;//默认根据first排序
    int mx=0;
    for(int i=1;i<=n;i++){
        r[i]=upper_bound(s+i,s+1+n,k[i]*c[i]+s[i-1])-s-1;//寻找r的值
        b[i]=r[i]-i+1;
        mx=max(b[i],mx);
        q.push({-b[i],i});//因为优先队列默认是大根堆,所以取反就是小根堆了
    }
    int ans=mx+q.top().first;
    while(m--){
        auto u=q.top();q.pop();
        int indx=u.second;
        c[indx]++;
        r[indx]=upper_bound(s+indx,s+1+n,k[indx]*c[indx]+s[indx-1])-s-1;//更新r值
        b[indx]=r[indx]-indx+1;//更新b的值
        mx=max(mx,b[indx]);//维护最大值
        q.push({-b[indx],indx});
        ans=min(ans,mx+q.top().first);//更新ans
    }
    cout<<ans;
    return 0;
}

标签:满意度,int,元素,最小,队列,数组
From: https://www.cnblogs.com/bu-fan/p/17723938.html

相关文章

  • 【数据结构】第四章 多维数组与广义表
    4.1数组的逻辑结构和基本运算数组可看成是一种特殊的线性表,其特殊在于,表中的数组元素本身也是一种线性表。在早期的高级语言中,数组是唯一可供使用的数据类型。由于数组中各元素具有统一的类型,并且数组元素的下标一般具有固定的上界和下界,因此,数组的处理比其他复杂的结构更为简单。......
  • 计算机小白的成长历程——数组(2)
    大家好,很高兴又和大家见面啦!在上一篇我们介绍了一维数组的相关内容,今天咱们要介绍的是二维数组的相关内容。二维数组的创建和初始化1.二维数组的创建(1)什么是二维数组个人理解对于二维数组,我是这样理解的:一维就是一条线,二维就是一个面,那一维数组就是只有一行或者一列的数组,而二维数......
  • 数据结构之 - 深入了解数组数据结构
    数组是计算机科学中最基本且常用的数据结构之一。在本文中,我们将深入介绍数组的特性、操作以及在实际应用中的使用场景。通过全面了解数组,你将能够更好地理解它的原理和如何应用于解决问题。1.什么是数组?数组是一种线性数据结构,它由一系列相同类型的元素组成,这些元素被存储在连续......
  • JavaScript 终于原生支持数组分组了!
    在日常开发中,很多时候需要对数组进行分组,每次都要手写一个分组函数,或者使用lodash的groupBy函数。好消息是,JavaScript现在正在引入全新的分组方法:Object.groupBy和Map.groupBy,以后再也不需要手写分组函数了,目前最新版本的Chrome(117)已经支持了这两个方法!以前的数组分组假设有一......
  • 后缀数组 SA 学习笔记 (一)
    好像有一些图片炸了,慢慢修后缀数组SA学习笔记(一)目录目录后缀数组SA学习笔记(一)目录计数排序CountingSortCode桶排序BucketSort基数排序RadixSortCodeid[]和rk[]后缀数组SuffixArray基础概念计算后缀数组讨论Code讨论KK3299.DescriptionSolutionCode计数排序......
  • JavaScript 终于原生支持数组分组了!
    在日常开发中,很多时候需要对数组进行分组,每次都要手写一个分组函数,或者使用lodash的groupBy函数。好消息是,JavaScript现在正在引入全新的分组方法:Object.groupBy和Map.groupBy,以后再也不需要手写分组函数了,目前最新版本的Chrome(117)已经支持了这两个方法!以前的数组分组假设有一......
  • 算法打卡|Day2 数组part02
    Day2数组part02今日任务:977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II目录Day2数组part02今日任务:977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵IIProblem:977.有序数组的平方思路解题方法复杂度CodeProblem:209.长度最小的子数组思路解题方法复杂......
  • 08_一唯字符数组
    一维字符数组一维字符数组初始化逐个元素初始化(不推荐)chararr[5]={'h','e','l','l','o'};以字符串方式初始化(推荐)chararr[6]="hello";以上两种区别sizeof测字符数组chararr1[16]="";cout<<sizeof(arr1)<<......
  • 稀疏数组
    稀疏数组二维数组常常因为太多的默认值无意义的0记录了很多无意义的数据我们可以使用稀疏数组来解决行列值[0]共几行共几列共几个有效值[1]值在哪一行值在哪一列该有效值[2]以此类推[3][4]打印二维数组转换稀疏数组还原稀疏数......
  • c语言双指针法--原地删除数组中的元素
     27.移除元素-力扣(LeetCode) intremoveElement(int*nums,intnumsSize,intval){intleft=0;intright=0;while(right<numsSize){if(nums[right]!=val){nums[left]=nums[right];left++;}......