博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 433C. Ryouko's Memory Note (中位数,瞎搞,思维)
阅读量:5334 次
发布时间:2019-06-15

本文共 1474 字,大约阅读时间需要 4 分钟。

题目链接:

题意:

给你一堆数字,允许你修改相同的数字成为别的数字,也可以修改成自己,问你修改后相邻数字的距离的绝对值的和最小是多少。

思路:

首先明确一个结论,一个数轴上一些点,要求一个与他们距离之和尽量小的点,那么这个点就是这些点的中位数,即排序后位于中间的数。

这题的思路是把每一个数的与之相邻的保存下来,为了方便,可以用vector数组。然后为了使得距离之和最短,要取中位数。在一串数字中,距所有数字距离之和最短的就是中位数了,这点应该很好理解。然后把该值修改为该中位数,然后最后找出能使值减少的最大的就是最终要修改的值。

代码:

#include
using namespace std;typedef long long ll;#define MS(a) memset(a,0,sizeof(a))#define MP make_pair#define PB push_backconst int INF = 0x3f3f3f3f;const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}//const int maxn = 1e5+10;ll n,m,a[maxn];vector
g[maxn];int main(){ cin >> n >> m; ll mi=INF,mx=-1,sum=0; for(int i=1; i<=m; i++){ cin >> a[i]; mi = min(mi,a[i]); mx = max(mx,a[i]); if(i!=1 && a[i]!=a[i-1]) { sum += abs(a[i]-a[i-1]); g[a[i]].push_back(a[i-1]); g[a[i-1]].push_back(a[i]); } } ll ans = sum; for(ll i=mi; i<=mx; i++){ ll tmp = sum; int sz = g[i].size(); if(sz == 0) continue; sort(g[i].begin(),g[i].end()); ll x = g[i][sz/2]; for(int j=0; j<(int)g[i].size(); j++){ int t = g[i][j]; tmp += abs(x-t)-abs(i-t); } ans = min(ans,tmp); } cout << ans << endl; return 0;}

 

转载于:https://www.cnblogs.com/yxg123123/p/7236966.html

你可能感兴趣的文章
session和xsrf
查看>>
跟随大神实现简单的Vue框架
查看>>
Linux目录结构
查看>>
LeetCode-Strobogrammatic Number
查看>>
luoguP3414 SAC#1 - 组合数
查看>>
五一 DAY 4
查看>>
(转)接口测试用例设计(详细干货)
查看>>
【译】SSH隧道:本地和远程端口转发
查看>>
win8.1安装Python提示缺失api-ms-win-crt-runtime-l1-1-0.dll问题
查看>>
图片点击轮播(三)-----2017-04-05
查看>>
判断两个字符串是否相等【JAVA】
查看>>
直播技术细节3
查看>>
《分布式服务架构:原理、设计于实战》总结
查看>>
java中new一个对象和对象=null有什么区别
查看>>
字母和数字键的键码值(keyCode)
查看>>
协议和代理
查看>>
IE8调用window.open导出EXCEL文件题目
查看>>
sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法(转)...
查看>>
[转]iOS学习笔记(2)--Xcode6.1创建仅xib文件无storyboard的hello world应用
查看>>
Spring mvc初学
查看>>