带权中位数

话说在3085年,外星人打算来入侵地球,这个消息被我国的情报部门秘密截获,于是便打算联系世界各个国家,一
起研究商量对策。由于每个国家所需派的技术员人数不同,所以目前无法决定到底要在哪个国家设置个研究所进行
研究,幸运的是所有国家都在一条直线上,现在知道每个国家与我国的距离和该国的研究员人数。请你为他们决定
一下到底在那个国家建立研究所可以使所有研究员集中到该国的费用最小。

Input

输入文件每一行描述一个国家的信息。
首先是该国派出的技术员人数,紧跟着的是这个城市相对于我国的距离,最后是国家的名称。
国家数不大于5000

Output

输出文件只需要一行,即研究所设定的国家名称。

Sample Input

7 9289 JAPAN
5 8523 AMERICA
3 5184 CHINA
8 2213 VIJOS
10 0 DDS

Sample Output

VIJOS

sol:本题每个点增加了人数,即带权中位数。
 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn = 5010;
 6 struct Country
 7 {
 8   double p, dis;
 9   string name;
10   bool operator < (const Country& a) const
11   {
12     return dis < a.dis;
13   }
14 }C[maxn];
15 int n = 0;double sum=0,ans=0;
16 int main()
17 {
18   while(cin >> C[n].p >> C[n].dis >> C[n].name)
19   {
20       sum+=C[n].p;
21     n++;
22   }
23   sum/=2; sum++;
24   sort(C, C + n);
25   for(int i=0;i<n;i++)
26     {
27         ans+=C[i].p;
28         if (ans>=sum)
29         {
30             cout<<C[i].name;
31             return 0;
32         }
33     }
34 }

原文地址:https://www.cnblogs.com/cutepota/p/12126278.html

时间: 2024-10-16 03:44:57

带权中位数的相关文章

[POJ 1723]SOLDIERS(带权中位数问题)

题目链接:http://poj.org/problem?id=1723 最近因为在为NOIP 2014复习,一直没写啥题解... 这个题目的意思是给你n个士兵在棋盘里的坐标,要你将他们排成连续的一行(即与x轴平行),问你最少要将这些士兵移动多少步. 思路:设最终连续的一行的开头坐标为(linex,liney),终点坐标为(linex+n-1,liney) 将x坐标和y坐标分开讨论. y坐标上,要让士兵移动步数最少,则liney=士兵们的y坐标的中位数 x坐标上士兵的移动步数=|x1-linex|

poj 1723 SOLDIERS 带权中位数

题目 http://poj.org/problem?id=1723 题解 带权中位数类型的题目~ 可以先考虑降维,最后集合的y坐标,明显是y坐标的中位数的位置,容易求出y方向的贡献res_y.比较麻烦的是在x坐标上最后是要列成一排,而不是单独的一个点,我们可以假设最后集合的最左边的点是x,采用贪心的策略列出公式:res_x=sum(abs(xi-x-i))(i belongs to [0,n-1]).令zi=xi-i,就转化为res_x=sum(abs(zi-x)),这相当于求zi数列的中位数(

中位数及带权中位数题集

codevs 3625 1 #include <bits/stdc++.h> 2 using namespace std; 3 int x[11111], y[11111]; 4 int main() 5 { 6 int n; scanf("%d", &n); 7 for(int i = 1; i <= n; i++) scanf("%d %d", &x[i], &y[i]); 8 ///先处理y 9 sort(y + 1,

[总结]中位数及带权中位数问题

目录 一.中位数问题 1. 问题模型 2. 结论 3. 推导 4. 例题 二.带权中位数问题 1. 问题模型 2. 结论 3. 推导 4. 例题 一.中位数问题 1. 问题模型 数轴\(x\)上有\(n\)个点,现在给出这\(n\)个点的坐标\(a[i](i\in [1,n])\),让你选择一个点\(k(k\in [1,n])\),使得每个点到点\(k\)的距离之和最小. 2. 结论 点\(k\)为序列的中位数时最优: 若n为奇数,点\(k\)位于a[(n+1)/2]处最优:若n为偶数,点\(k

数学 + 带权中位数 - SGU 114 Telecasting station

Telecasting station Problem's Link Mean: 百慕大的每一座城市都坐落在一维直线上,这个国家的政府决定建造一个新的广播电视台. 经过了许多次试验后,百慕大的科学家们提出了一个结论:在每座城市的不满意度等于这座城市的市民数与这座城市与广播电视台的距离的乘积. 你需要找到这个一维直线上的一点来建造广播电视台,使得所有城市的不满意度的和最小. analyse: 个人觉得应该是加权平均数,然而却是求中位数. 可以这样想:随便挑一个点作为station,左右移动一下看看

Putting Boxes Together CodeForces - 1030F (带权中位数)

#include <iostream> #include <algorithm> #include <cstdio> #include <math.h> #include <set> #include <map> #include <queue> #include <string> #include <string.h> #include <bitset> #define REP(i,a

Java数据结构——带权图

带权图的最小生成树——Prim算法和Kruskal算法 带权图的最短路径算法——Dijkstra算法 package graph; // path.java // demonstrates shortest path with weighted, directed graphs 带权图的最短路径算法 // to run this program: C>java PathApp ////////////////////////////////////////////////////////////

并查集模板 &amp;&amp; 带权并查集模板

不带权: 1 int f[50050]; 2 void init(void) 3 { 4 for(int i=1;i<=n;i++) 5 f[i]=i; 6 } 7 int fd(int x) 8 { 9 return f[x]==x?x:fd[x]=fd(f[x]); 10 } 11 int uion(int x,int y) 12 { 13 int fa=fd(x),fb=fd(y); 14 if(fa!=fb)f[fa]=fb; 15 } 带权: 1 int f[K],rl[K]; 2 3

hdu3038(带权并查集)

题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 题意: n表示有一个长度为n的数组, 接下来有m行形如x, y, d的输入, 表示从第x,个元素到第y个元素的和为d(包括x, 和y), 问m行输入里面有几个是错误的(第一个输入是正确的); 思路: 很显然带权并查集咯,我们可以用距离的概念代替和的概念比较好理解一点,d表示x到y的和即x到y的距离; 可以用rank[x]表示x到其父亲节点的距离,  将正确的距离关系合并到并查集中