zoey
点击国内主页可以让浏览速度加快哦 ~ !

关于HDOJ 1157题(Who's in the Middle(中位数)) 的理解(C/C++)

2019-08-09 hdoj 数组去重
Word count: 590 | Reading time: 3min

就是道水题,结果自己想太多,还去考虑去重后排序。。。其实就是规定的奇数n求中间数的大水题

题目描述

                                              Who’s in the Middle

Problem Description
FJ is surveying his herd to find the most average cow. He wants to know how much milk this ‘median’ cow gives: half of the cows give as much or more than the median; half give as much or less.

Given an odd number of cows N (1 <= N < 10,000) and their milk output (1..1,000,000), find the median amount of milk given such that at least half the cows give the same amount of milk or more and at least half give the same or less.

Input

  • Line 1: A single integer N

  • Lines 2..N+1: Each line contains a single integer that is the milk output of one cow.

Output

  • Line 1: A single integer that is the median milk output.

Sample Input
5
2
4
1
3
5

Sample Output
3

Hint

INPUT DETAILS:

Five cows with milk outputs of 1..5

OUTPUT DETAILS:

1 and 2 are below 3; 4 and 5 are above 3.

Source
USACO 2004 November

原题链接

More info:Question

数组去重

去重函数unique

头文件:algorithm,所以别忘了加上一句:#include< algorithm >


unique的作用就是”去除”数组中相邻的重复元素,所以一般乱序去重都会配合sort()一起使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
//a 去重是和旁边的元素对比去重
int a[10] = {0,1,2,3,4,5,6,7,8,9 };
a[3] = a[5] = a[7] = 2;
int len = unique(a, a + 10) - a;
cout << len << endl; //len = 9
for (int i = 0; i < len; i++)
cout << a[i] << " "; //a = 0 1 2 4 2 6 2 8 9
cout << endl;
//b 所以一般去重要配合sort使用
int b[10] = { 0,1,2,3,4,5,6,7,8,9 };
b[3] = b[5] = b[7] = 2;
sort(b, b + 10);
int len_ = unique(b, b + 10) - b;
cout << len_ << endl; //len_ = 7
for (int i = 0; i < len_; i++)
cout << b[i] << " "; //b = 0 1 2 4 6 8 9

return 0;
}

Accepted代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
int ans[10001];
int main() {
while (cin >> n) {
for (int i = 0; i < n; i++)cin >> ans[i];

sort(ans, ans + n);
//int len=unique(ans, ans + n) - ans;

cout << ans[n / 2 ] << endl;

}
return 0;
}

参考博客

非常感谢qq_41139830的博文

Author: Zoey

Link: https://zoey1038569979.github.io/2019/08/09/hdoj1157/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
关于HDOJ 1196题(Lowest Bit(最低位数)) 的理解(C/C++)
NextPost >
关于HDOJ 1106题(排序) 的理解(C/C++)
CATALOG
  1. 1. 题目描述
  2. 2. 原题链接
  3. 3. 数组去重
  4. 4. Accepted代码
  5. 5. 参考博客