ARC 100 C - Linear Approximation题解---三分法

  • 题目链接:

    https://arc100.contest.atcoder.jp/tasks/arc100_a

  • 分析:

    比赛时做这题想到一个瞎搞的方法就是在平均数上下波动一下取最小值,然后大佬yjw学长说这就是个严格单调单峰函数直接三分法就好了,虽然之前就听过则还是第一次打

  • 三分法

    设有最大值函数f(x)定义域为\([l,r]\),我们在定义域内找两个点\(lmid,rmid(lmid<rmid)\)

    • 若\(f(lmid)<f(rmid)\),要么\(lmid\)和\(rmid\)都在单峰左边,要么\(lmid\)在左边,\(rmid\)在右边,但无论怎样\(lmid\)都在单峰左边,于是将\(l=lmid\)
    • 若\(f(lmid)<f(rmid)\),分析相似,将\(r=rmid\)
    • 若\(f(lmid)==f(rmid)\)emmm这个其实我也不知道怎么处理,随便按上面一种情况来吧但总感觉不太稳
  • 代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <map>
#include <queue>
#include <algorithm>
#define ri register int
#define ll long long
using namespace std;
const int maxn=200005;
const int inf=0x7fffffff;
template <class T>inline void read(T &x){
    x=0;int ne=0;char c;
    while(!isdigit(c=getchar()))ne=c==‘-‘;
    x=c-48;
    while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48;
    x=ne?-x:x;
    return ;
}
int n;
ll a[maxn];
ll sum=0;
inline ll solve(int k){
    ll cnt=0;
    for(ri i=1;i<=n;i++)cnt+=abs(a[i]-k);
    return cnt;
}
int main(){
    read(n);
    for(ri i=1;i<=n;i++){
       read(a[i]);
       a[i]=a[i]-i;
    }
    ll ans,lmid,rmid;
    ll l=-1e9,r=1e9;
    while(l<r-1){
        lmid=(l+r)>>1,rmid=(lmid+r)>>1;
        if(solve(lmid)>solve(rmid))l=lmid;
        else r=rmid;
    }
    if(solve(l)<solve(r))ans=l;
    else ans=r;
    printf("%lld\n",solve(ans));
    return 0;
}

原文地址:https://www.cnblogs.com/Rye-Catcher/p/9255304.html

时间: 2024-10-10 03:41:18

ARC 100 C - Linear Approximation题解---三分法的相关文章

ARC 100

链接 https://arc100.contest.atcoder.jp/ C Linear Approximation 题解 把ai减去i后排序, 我们要的b就是排完序后的中位数 Code 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 ll read(){ 6 ll x=0,f=1;char c=getchar(); 7 while(c<'0' || c>'9'){if(c

网易2018.03.27算法岗,三道编程题100%样例AC题解

博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/8660814.html特别不喜欢那些随便转载别人的原创文章又不给出链接的所以不准偷偷复制博主的博客噢~~ 1. 自定义排序 第一题是第一行给出n(1<=n<=100),表示下面有n行,每行A(0<=A<24)和B(0<=B<60),表示定的闹钟为AhBmin. 接下来给定X,表示小明从起床到教室需要X分钟,最后一行给出A(0<=A

【AtCoder】 ARC 100

link C-Linear Approximation 给出\(N\)个数\(A_1,A_2,...,A_N\) ,求一个数\(d\),最小化\(\sum_{i=1}^N|A_i-(d+i)|\) 把\(A_i-i\)排个序,选取\(d=\)它们的中位数 #include<bits/stdc++.h> #define ll long long #define dbg1(x) cerr<<#x<<"="<<(x)<<"

【AtCoder】ARC100 题解

C - Linear Approximation 找出\(A_i - i\)的中位数作为\(b\)即可 题解 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #define enter putchar('\n') #define space putchar(' ') #define fi first #define se second #define

HTML5 Canvas arc()函数//////////////////////(转)

HTML5 Canvas arc()函数 实例 创建一个圆形: var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.beginPath(); ctx.arc(100,75,50,0,2*Math.PI); ctx.stroke(); 浏览器支持 Internet Explorer 9.Firefox.Opera.Chrome 以及 Safari 支持 arc() 方法.

对canvas arc()中counterclockwise参数的一些误解

一直没有很细心地去研究CanvasRenderingContext2D对象的arc方法,对它的认识比较模糊,导致犯了一些错误,特发此文,以纠正之前的错误理解. arc()方法定义如下: arc() 方法使用一个中心点和半径,为一个画布的当前子路径添加一条弧. 语法: arc(x, y, radius, startAngle, endAngle, counterclockwise) 参数 描述 x, y 描述弧的圆形的圆心的坐标. radius 描述弧的圆形的半径. startAngle, end

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等

超多经典 canvas 实例 普及:<canvas> 元素用于在网页上绘制图形.这是一个图形容器,您可以控制其每一像素,必须使用脚本来绘制图形. 注意:IE 8 以及更早的版本不支持 <canvas> 元素. 贴士:全部例子都分享在我的 GayHub - https://github.com/bxm0927/canvas-special 尤雨溪个人主页炫彩三角纽带效果,点击还可变换 GitHub源码 . Demo演示 知乎登录注册页动态离子背景效果 GitHub源码 . Demo演

HTML5 arc的例子

demo.html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>arc</title> <script> function init() { var canvas=document.getElementById('canvas'); var ctx=canvas.getContext(&q

HTML5 Canvas arc()函数

实例 创建一个圆形: var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.beginPath(); ctx.arc(100,75,50,0,2*Math.PI); ctx.stroke(); 浏览器支持 Internet Explorer 9.Firefox.Opera.Chrome 以及 Safari 支持 arc() 方法. 注释:Internet Explorer