首页 > 其他分享 >三分!船新的知识点!

三分!船新的知识点!

时间:2023-09-11 22:23:40浏览次数:37  
标签:知识点 音乐会 10 位置 样例 long 三等分 船新 三分

题目链接

ACWING5201 午餐音乐会
这个题带我了解了三分!

题目描述

一维数轴上站着 N个人,编号 1∼N。初始时,第 i 个人位于整数坐标位置 Pi,此人移动 1单位距离所需的成本为 Wi,他能听到与他相距不超过Di的所有位置发出的声音。不同的人的位置可以重叠。现在,我们需要选择一个整数坐标位置,并在此位置举办一场音乐会。没有人想要错过这场音乐会,所以音乐会开始后,所有听不到音乐的人都会朝音乐会举办位置方向移动,直到移动至可以听到音乐的位置为止。我们希望合理选择音乐会的举办位置,使得所有人的移动总成本尽可能小。你输出这个总成本的最小可能值。

  • 输入格式
    第一行包含一个整数N。
    接下来 N 行,每行包含三个整数 Pi,Wi,Di

  • 输出格式
    一个整数,表示最小总成本。

  • 数据范围

\[1≤N≤2×10^{5} \]

\[0≤Pi≤10^{9} \]

\[1≤Wi≤1000 \]

\[0≤Di≤10^{9} \]

  • 输入样例1:
1
0 1000 0
  • 输出样例1:
0
  • 样例1解释
    最佳方案是在位置 0 举办音乐会,这样唯一的人无需任何移动即可听到音乐会。

  • 输入样例2:

2
10 4 3
20 4 2
  • 输出样例2:
20
  • 样例2解释
    一种最佳方案是在位置 14
    举办音乐会,这样的话,第一个人需要移动至位置 11
    ,所需成本为 (11−10)×4=4
    ,第二个人需要移动至位置 16
    ,所需成本为 (20−16)×4=16
    ,总成本为 4+16=20

  • 输入样例3:

3
6 8 3
1 4 1
14 5 2
  • 输出样例3:
43

题目理解

对于我来说,这个题非常棒!是我完全没有做过的类型题。该题目需要完成一个目的就是让移动的消耗最少。
这个题的知识点是三分,因为我之前接触的二分,么办法解决,因为我没法确定是往左移损耗最小还是往右移动损耗最小。
我们经过分析题目可以得到如下图示结果:
每一个人的移动消耗图解

  • 我们可以看出,只有在这个长度为D的区间,损耗是0,往两边都会增加。是一个下凸函数。
  • 下凸函数有个性质,就是多个下凸函数求和,仍为下凸函数。
  • 然后我们就可得到总的损耗变化趋势,如下图。
    总体下凸趋势
  • 得到这个趋势,我们取三等分点。我们首先规定,左边的三等分点一定是大于等于右边的三等分点。那么就会有以下两种情况。
    情况一
    情况二
    很明显根据图示,橘色部分一定不会是答案,那么就可以把我的左边界,赋值为左三等分点!!
  • 右三等分点的情况相同。可以将右三等分点右边的部分去掉!那么最后就可以找到答案啦!!
    这个题非常不错!学到了新东西!

代码实现

#include<iostream>
#include<cmath>
using namespace std;

const long long N = 2e5 + 10;

long long p[N], w[N], D[N];
int n;
int l = 0, r = 1e9;


long long check(long long u)
{

    long long sum = 0;


    for(long long i = 1; i <= n; i++)
    {
        if(abs(p[i] - u) > D[i])
        {

            if(u >= p[i])
                sum += w[i] * (u - p[i]  - D[i]);
            else
                sum += w[i] * (p[i] - u - D[i]);
        }
    }

    return sum;
}


int main()
{
    cin >> n;

    for(long long i = 1; i <= n; i++)
        cin >> p[i] >> w[i] >> D[i];


    while (l <= r)
    {
        int midl = l + (r - l) / 3;
        int midr = r - (r - l) / 3;
        if (check(midl) <= check(midr)) r = midr - 1;
        else l = midl + 1;
    }

    cout << min(check(l), check(r));

    return 0;
}

标签:知识点,音乐会,10,位置,样例,long,三等分,船新,三分
From: https://www.cnblogs.com/wxzcch/p/17694690.html

相关文章

  • 嵌入式三级知识点总结
    今天暂停更新一波实战,拿去我当年考嵌入式三级的知识清单来分享给大家吧!1、ADD加法指令,AND是逻辑与,SUBS是带进位的减法指令,BEQ是跳转指令。2、小端模式是指高位保存在高地址中,LDRR0,[R1,#4]将R1寄存器的内容自动增加4。3、MOVR0,R1,LSL#3 中的LSL的意思是左移。4、速度不高的外......
  • 【学习笔记】【自学】【模板】三分法
    题目描述:给定一个$n$次函数$f(x)$形如$a_1x^n+a_{2}x^{n-1}+......+a_{n-1}x^2+a_nx+a_{n+1}$,求$f(x)_{\max}$,且$x\in[l,r]$,设使得$f(x)_{\max}$的$x$为$x_{\max}$。对于一个区间$[l,r]$而言,若确定使得$f(x)$为最大值的$x$定在$[l,r]$中,则可以使用三分法求......
  • wzOI 2023.8.24 模拟赛(附树的直径和三分法)
    2023-08-2815:53:53$$A$$典型错误一知半解看样例型:如果该队某个数组的值比最大值大就算入答案。上第一次厕所前我的思路:开局\(30\)分钟。显然,我并不需要有一个数值最大才能赢,我只需要其中一个数值比其中一个数值比其中一个数值最大的那个要大的队要大即有可能获胜......
  • vue知识点总结
    一、MVVM模型(model-view-viewmodel) ......
  • layuiadmin(官方)知识点
    动态模板layuiAdmin的视图是一个“动静结合”的载体,除了常规的静态模板,你当然还可以在视图中存放动态模板,因此它可谓是焦点中的焦点。定义模板在视图文件中,通过下述规则定义模板:<scripttype="text/html"template><!--动态模板碎片--></script>下面是一个简单的例子:<scri......
  • new方法、定制属性访问、描述符与装饰器知识点总结
    一:__new__方法思考:a.我们创建实例是通过什么方法创建的呢?b.类每次实例化的时候都会创建一个新的对象,如果要求类只能被实例化一次该怎么做呢?===通过单利模式实现   c.什么是单例模式(SingletonPattern 1、确保一个类只有一个实例,而且自行实例化并向整个系......
  • SpringCloud知识点整理
         ......
  • 排序算法知识点和常见面试题
    查找和排序算法知识点和常见面试题查找二分查找排序算法知识点冒泡排序插入排序选择排序快速排序二分思维+递归思维#include<stdio.h>intFindPos(int*a,intlow,inthigh);voidQuickSort(int*a,intlow,inthigh);intmain(void){ inta[6]={-2,1,......
  • 每个.NET开发都应掌握的C#集合知识点
    上篇文章讲述了C#委托和事件知识点,本文将介绍C#集合知识点。作为.NET开发人员,C#集合是你在构建强大和高效应用程序时的关键技能之一。C#集合提供了一系列丰富的数据结构,可以帮助你更好地管理、操作和组织数据。本文将介绍一些每个.NET开发人员都应该掌握的C#集合知识点。1、灵活......
  • 纯干货!一文get昇腾Ascend C编程入门全部知识点
    本文分享自华为云社区《昇腾AscendC编程入门教程》,作者:昇腾CANN。2023年5月6日,在昇腾AI开发者峰会上,华为正式发布了面向算子开发场景的昇腾AscendC编程语言。AscendC原生支持C/C++编程规范,通过多层接口抽象、并行编程范式、孪生调试等技术,极大提高了算子的开发效率,帮助AI开发......