[POJ 1723]SOLDIERS(带权中位数问题)
来源:互联网 发布:seo研究中心教程下载 编辑:程序博客网 时间:2024/05/18 01:26
题目链接:http://poj.org/problem?id=1723
最近因为在为NOIP 2014复习,一直没写啥题解。。。
这个题目的意思是给你n个士兵在棋盘里的坐标,要你将他们排成连续的一行(即与x轴平行),问你最少要将这些士兵移动多少步。
思路:设最终连续的一行的开头坐标为(linex,liney),终点坐标为(linex+n-1,liney)
将x坐标和y坐标分开讨论。
y坐标上,要让士兵移动步数最少,则liney=士兵们的y坐标的中位数
x坐标上士兵的移动步数=|x1-linex|+|(x2-1)-linex|+...+|(xn-n+1)-linex|。
x坐标上求最少移动步数对应的linex就是一个带权中位数问题,我们要找的linex就是这个带权中位数。
对x坐标进行排序,设排序后数组为x1',x2'...xn'
设tmp数组,tmp1=x1'-0,tmp2=x2'-(2-1),....tmpn=xn'-(n-1)
对tmp数组再排序,linex就是tmp数组的中位数。
剩下求最少移动步数的过程很简单就不多废话了
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>#include <cmath>#define MAXN 10005using namespace std;int x[MAXN],y[MAXN];int main(){ int n,liney,linex,ans=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&x[i],&y[i]); } sort(y+1,y+n+1); liney=y[(n+1)/2]; for(int i=1;i<=n;i++) ans+=abs(y[i]-liney); sort(x+1,x+n+1); for(int i=1;i<=n;i++) { x[i]=x[i]-i; } sort(x+1,x+n+1); linex=x[(n+1)/2]; for(int i=1;i<=n;i++) { ans+=abs(x[i]-linex); } printf("%d\n",ans); return 0;}
0 0
- [POJ 1723]SOLDIERS(带权中位数问题)
- poj 1723Soldiers 带全中位数
- poj 1723 SOLDIERS 中位数
- POJ - 1723 Soldiers 士兵站队 排序+中位数
- 带权中位数问题:
- POJ 1723 SOLDIERS
- POJ--1723--SOLDIERS
- Poj 1723 SOLDIERS
- POJ 1723 SOLDIERS
- poj 1723(SOLDIERS)
- POJ 1723 SOLDIERS
- POJ 1723 SOLDIERS 笔记
- POJ 1723 SOLDIERS (水)
- 中位数及带权中位数问题
- POJ 1723 SOLDIERS(水~)
- POJ1723 SOLDIERS【中位数+排序】
- 二维邮局选址问题-带权中位数
- 中位数及带权中位数
- Android中layout过程详解 (结合Android 4.0.4 最新源码)
- apache http benchmark tool--ab
- C++继承与多态示例
- @SuppressWarnings
- Linux ALSA声卡驱动之七:ASoC架构中的Codec
- [POJ 1723]SOLDIERS(带权中位数问题)
- iOS面试题
- javaBean内省
- 设计模式学习(结构型模式)—装饰模式(Decorator)
- 写给自己(11月)
- Access数据类型和.NET数据类型映射
- 聚类分析之K中心点算法(k-mediods)
- UIWindow
- 冯仑:创业,是一种特别的人生