擦。。今天这套题好尼玛难啊,做了一个小时,连一题都没做出来,而且还没什么头绪

查了下出题人,师大附中的 14年毕业 13年拿到的国家集训队资格 保送清华

题意是 给一串序列,计算一个值,这个值是 相邻两数的距离(或者说差的绝对值)的总和,你可以改变任意一种数(即序列里所有该数字全部变成另一个数),但只能改一次,使得刚刚要求得那个值最小。

要是只改一个数,那就很简单了,但是这个题是要改一种数,序列式乱序的,所求值跟相邻数有关,所以又不能随便打乱顺序。

然后就疯狂抓头。。

后来还是看的题解

其实题目里面改变一种数其实也很好处理,把该种数的相邻的数字都给存起来,然后就是看该数字跟这些m个数(假设为m个)的距离的最小了。根据以前数轴的思想,不难得出,只要把当前该x值,变成排序过后的m个数列中的中位数即可。因为中位数的性质就是跟所有序列数的距离和最小,这个用数轴思想很容易证明。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL __int64
using namespace std;
const int N = +;
int A[N];
int n,m;
int vis[N];
vector<int> v[N];
int abs(int x)
{
if (x<) return -x;
else return x;
}
int main()
{
while (scanf("%d%d",&n,&m)!=EOF)
{
LL ans=;
memset(vis,,sizeof vis);
for (int i=;i<=m;i++){
scanf("%d",&A[i]);
if (i>){
if (A[i]!=A[i-]){
v[A[i]].push_back(A[i-]);
v[A[i-]].push_back(A[i]);
}
ans+=(LL)abs(A[i]-A[i-]);
}
}
LL maxn=;
if (m>)
for (int i=;i<=m;i++){
if (vis[A[i]]) continue;
vis[A[i]]=;
sort(v[A[i]].begin(),v[A[i]].end());
int r=v[A[i]].size();
if (r==) continue;
r/=;
int mid=v[A[i]][r];
LL t1=;
LL t2=;
for (int j=;j<v[A[i]].size();j++){
t1+=(LL)abs(mid-v[A[i]][j]);
}
for (int j=;j<v[A[i]].size();j++){
t2+=(LL)abs(A[i]-v[A[i]][j]);
}
maxn=max(maxn,t2-t1);
}
ans-=maxn;
printf("%I64d\n",ans);
}
return ;
}

Codeforces 433C #248_div1_A 中位数的应用的更多相关文章

  1. CodeForces 433C Ryouko's Memory Note-暴力

                                             Ryouko's Memory Note Time Limit:1000MS     Memory Limit:262 ...

  2. CodeForces 433C Ryouko's Memory Note (中位数定理)

    <题目链接> 题目大意:给你一堆数字,允许你修改所有相同的数字成为别的数字,不过只能修改一次,问你修改后序列相邻数字的距离和最小是多少. 解题分析: 首先,修改不是任意的,否则那样情况太多 ...

  3. codeforces 433C. Ryouko's Memory Note 解题报告

    题目链接:http://codeforces.com/problemset/problem/433/C 题目意思:一本书有 n 页,每页的编号依次从 1 到 n 编排.如果从页 x 翻到页 y,那么| ...

  4. CodeForces 710B Optimal Point on a Line (数学,求中位数)

    题意:给定n个坐标,问你所有点离哪个近距离和最短. 析:中位数啊,很明显. 代码如下: #pragma comment(linker, "/STACK:1024000000,10240000 ...

  5. Problem - 433C - Codeforces解题报告

    对于这题本人刚开始的时候的想法是:先把最大两数差的位置找到然后merge计算一个值再与一连串相同的数做merge后计算一个值比较取最大值输出:可提交后发现不对,于是本人就搜了一下正解发现原来这题的正确 ...

  6. (CodeForces )540B School Marks 贪心 (中位数)

    Little Vova studies programming to p. Vova is very smart and he can write every test for any mark, b ...

  7. Codeforces Round #496 (Div. 3 ) E1. Median on Segments (Permutations Edition)(中位数计数)

    E1. Median on Segments (Permutations Edition) time limit per test 3 seconds memory limit per test 25 ...

  8. CodeForces 289B Polo the Penguin and Matrix (数学,中位数)

    题意:给定 n * m 个数,然后每次只能把其中一个数减少d, 问你能不能最后所有的数相等. 析:很简单么,首先这个矩阵没什么用,用一维的存,然后找那个中位数即可,如果所有的数减去中位数,都能整除d, ...

  9. 【二分答案】【中位数】codeforces 394 bun

    bunDescription因为体育老师很喜欢等差数列,所以他要求学生们站队必须按身高站成等差数列.但是有些班级的学生无论如何也无法排成等差数列,于是体育老师从食堂买来了两种神奇的面包.吃一个第一种面 ...

随机推荐

  1. VScode禁用alt+key触发菜单栏快捷键

    因为用惯了Mac,突然改回Windows,但是已经习惯了按Command键.所以在Windows下把vscode的快捷键全改成alt+key了.但是Windows的alt+key快捷键就比较烦人了.所 ...

  2. Lesson 3 Matterhorn man

    What was the main objective of early mountain climbers? Morden alpinists try to climb mountains by a ...

  3. Doxygen 注释语法规范

    背景 这一块的内容更多的是作为了解,但是可以以这样的规范作为自己的编程注释习惯,提高自己的软实力. Doxygen注释语法 注释格式 块注释建议统一使用 /** -- ***/ 行注释建议统一使用 / ...

  4. Binary Tree和Binary Search Tree

    Binary TreeDefinition: at most two children node. Binary Tree Example: 10 ==root /      \ 13        ...

  5. 无法删除oracle用户的问题

    http://blog.sina.com.cn/s/blog_684848d60101hj8a.html

  6. java关键字“static”

    Java中static使用方法 1.static静态变量 静态变量:每个类只有一个,所有实例共享: 实例变量:每个实例只有一个: package test2; import java.lang.Str ...

  7. xaml与CSS中的Margin顺序不同

    XAML中  Margin:左 上 右 下 CSS中      Margin:上 右 下 左

  8. TFIDF介绍

    简介 全称: Term Frequency-inverse document frequency(文本频率与逆文档频率指数) 目的: 表征一个token(可以是一个字或者一个词)的重要程度 是Elas ...

  9. C. Basketball Exercise dp

    C. Basketball Exercise time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  10. Web基础之日志

    Web基础之日志   日志在企业开发中有着不可或缺的作用,它可以用以记录用户操作.系统运行状态和错误信息.日志记录的好坏直接关系到系统出现问题时定位的速度.   最开始的日志一般使用log4j,后来s ...