题目1 : 优化延迟

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小Ho编写了一个处理数据包的程序。程序的输入是一个包含N个数据包的序列。每个数据包根据其重要程度不同,具有不同的"延迟惩罚值"。序列中的第i个数据包的"延迟惩罚值"是Pi。如果N个数据包按照<Pi1, Pi2, ... PiN>的顺序被处理,那么总延迟惩罚

SP=1*Pi1+2*Pi2+3*Pi3+...+N*PiN(其中i1, i2, ... iN是1, 2, 3, ... N的一个排列)。

小Ho的程序会依次处理每一个数据包,这时N个数据包的总延迟惩罚值SP为

1*P1+2*P2+3*P3+...+i*Pi+...+N*PN。

小Hi希望可以降低总延迟惩罚值。他的做法是在小Ho的程序中增加一个大小为K的缓冲区。N个数据包在被处理前会依次进入缓冲区。当缓冲区满的时候会将当前缓冲区内"延迟惩罚值"最大的数据包移出缓冲区并进行处理。直到没有新的数据包进入缓冲区时,缓冲区内剩余的数据包会按照"延迟惩罚值"从大到小的顺序被依次移出并进行处理。

例如,当数据包的"延迟惩罚值"依次是<5, 3, 1, 2, 4>,缓冲区大小K=2时,数据包被处理的顺序是:<5, 3, 2, 4, 1>。这时SP=1*5+2*3+3*2+4*4+5*1=38。

现在给定输入的数据包序列,以及一个总延迟惩罚阈值Q。小Hi想知道如果要SP<=Q,缓冲区的大小最小是多少?

输入

Line 1: N Q

Line 2: P1 P2 ... PN

对于50%的数据: 1 <= N <= 1000

对于100%的数据: 1 <= N <= 100000, 0 <= Pi <= 1000, 1 <= Q <= 1013

输出

输出最小的正整数K值能满足SP<=Q。如果没有符合条件的K,输出-1。

样例输入
5 38
5 3 1 2 4
样例输出
2

题目链接:hihoCoder 第136周

题目非常明显就是裸的二分答案,想测试的堆看看手写的是不是有问题,以及速度如何,比封装的pq要快一些前者700ms+后者1000ms+,方便起见我的堆是递归形式的,非递归就不是很熟了。

代码:

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 100010;
LL arr[N];
int n;
LL q;struct heap
{LL a[N];int sz;void init(){sz = 0;}void up(const int &cur){int fa = cur >> 1;if (fa > 0 && a[cur] > a[fa]){swap(a[cur], a[fa]);up(fa);}}void down(const int &cur){int lson = cur << 1, rson = cur << 1 | 1;if (lson > sz)return ;else{int tar;if (rson > sz)tar = lson;elsetar = a[lson] > a[rson] ? lson : rson;if (a[cur] < a[tar]){swap(a[tar], a[cur]);down(tar);}}}void push(int x){a[++sz] = x;up(sz);}void pop(){swap(a[sz--], a[1]);down(1);}LL top(){return a[1];}bool empty(){return !sz;}
};
heap one;bool check(const int &k)
{one.init();LL bas = 1LL;LL sp = 0LL;for (int i = 1; i <= k; ++i)one.push(arr[i]);for (int i = k + 1; i <= n; ++i){sp += (bas++) * one.top();one.pop();one.push(arr[i]);}while (!one.empty()){sp += (bas++) * one.top();one.pop();}return sp <= q;
}
int main(void)
{int i;while (~scanf("%d%lld", &n, &q)){for (i = 1; i <= n; ++i)scanf("%lld", arr + i);int ans = -1;int L = 1, R = n;while (L <= R){int mid = (L + R) >> 1;if (check(mid)){R = mid - 1;ans = mid;}elseL = mid + 1;}printf("%d\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/Blackops/p/6370087.html

hihoCoder 第136周 优化延迟(二分答案+手写堆)相关推荐

  1. vue渲染大量数据如何优化_Vue3 Compiler 优化细节,如何手写高性能渲染函数

    送5本<你不知道的 JavaScript 上卷>点我抽奖,祝大家好运 Vue3 的 Compiler 与 runtime 紧密合作,充分利用编译时信息,使得性能得到了极大的提升.本文的目的 ...

  2. Djkastra堆(手写堆)优化版

    直接上代码 代码中的注释掉的部分为C++优先队列实现 #include<cstdio> #include<cstdlib> #include<iostream> # ...

  3. 2021-最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)---手写代码篇

    ★★★ 手写代码:实现forEach map filter reduce ★★★ 手写实现一个简易的 Vue Reactive ★★★ 手写代码,监测数组变化,并返回数组长度 ★★★ 手写原生继承,并 ...

  4. 《二分答案》—— P1873 [COCI 2011/2012 #5] EKO / 砍树

    [COCI 2011/2012 #5] EKO / 砍树 题目描述 伐木工人 Mirko 需要砍 M M M 米长的木材.对 Mirko 来说这是很简单的工作,因为他有一个漂亮的新伐木机,可以如野火一 ...

  5. POJ 2018 Best Cow Fences (二分答案构造新权值 or 斜率优化)

    $ POJ~2018~Best~Cow~ Fences $(二分答案构造新权值) $ solution: $ 题目大意: 给定正整数数列 $ A $ ,求一个平均数最大的长度不小于 $ L $ 的子段 ...

  6. 切蛋糕4 likes in 二分答案,剪枝优化

    给定m个人和n块蛋糕 首先是需要先sort一遍把人的嘴的大小拍一遍序,如果是我,的话,用有限的蛋糕,满足的更多的人,我会选择满足 嘴巴小的人 所以先sort一遍,把所有的人的嘴巴排序一遍,二分答案 W ...

  7. [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案

    题目链接: [APIO2017]商旅 枚举任意两个点$(s,t)$,求出在$s$买入一个物品并在$t$卖出的最大收益. 新建一条从$s$到$t$的边,边权为最大收益,长度为原图从$s$到$t$的最短路 ...

  8. hiho 1483 区间计数问题+二分答案

    链接:http://hihocoder.com/problemset/problem/1483 题意:一个区间价值为区间中相同数的对数..求第k大区间 思路:和51nod上一个第k大区间类似,二分答案 ...

  9. [BZOJ4556][TJOI2016HEOI2016]字符串(二分答案+后缀数组+RMQ+主席树)

    4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1360  Solved: 545 ...

最新文章

  1. html语言星号,如何使HTML代码,输入的东西星号显示出来
  2. 阳光与阴谋:从投资者角度看理财周报-赛迪事件
  3. 石墨烯区块链(2)核心功能
  4. 图形—9patch,shape ,selector
  5. 如何使用 C# 中的 ValueTask
  6. poj2516Minimum Cost
  7. eddystone_超级计算机上的Linux,Google的Eddystone和更多新闻
  8. java singletonlist_Java Collections singletonList()方法及示例
  9. git使用的基本流程_我并不是高冷(Git进行中01):git基本流程简介
  10. 真正的免费云时代来临,免费1T全能空间
  11. 营业执照生成_电子营业执照如何获取?
  12. java基础语法笔记
  13. 详解数据库三大范式、BCNF范式
  14. webp是什么文件格式?
  15. 漫画:大公司病了,这也太形象了吧!!!
  16. 神经网络模型如何应用到实际 - 神经网络模型数学建模案例
  17. 3.15曝光智能骚扰产业链,连你月收入也知道!网易专家支招用户如何避免被“鱼肉”
  18. JDK1.8(jdk8)的下载与安装
  19. matlab的estimate函数,matlab的estimate函数输出值什么意思 [fit3 varcov logL info]=estimate(mdl,a)...
  20. java程序设计计算机二级,计算机二级Java程序设计真题及答案

热门文章

  1. linux下SublimeText的中文输入法问题之解决方案
  2. 学习LINUX第三天:最简单的LAMP组合(适合初学者)
  3. windows创建定时任务执行python脚本
  4. Android adb 串口调试
  5. grunt合并压缩js、css文件
  6. [模板]tarjan求强连通分量
  7. javascript 表单验证大全(一)
  8. 学习MongoDB(Troubleshoot Replica Sets) 集群排除故障
  9. Android开发之Handler和Looper的关系
  10. 自己动手实现OpenGL!