codeforces 166C Median - from lanshui_Yang
2 seconds
256 megabytes
standard input
standard output
A median in an array with the length of n is an element which occupies position number
after we sort the elements in the non-decreasing order (the array elements are numbered starting with 1). A median of an array (2, 6, 1, 2, 3) is the number 2, and a median of array (0, 96, 17, 23) — the number 17.
We define an expression
as the integer part of dividing number a by number b.
One day Vasya showed Petya an array consisting of n integers and suggested finding the array's median. Petya didn't even look at the array and said that it equals x. Petya is a very honest boy, so he decided to add several numbers to the given array so that the median of the resulting array would be equal to x.
Petya can add any integers from 1 to 105 to the array, including the same numbers. Of course, he can add nothing to the array. If a number is added multiple times, then we should consider it the number of times it occurs. It is not allowed to delete of change initial numbers of the array.
While Petya is busy distracting Vasya, your task is to find the minimum number of elements he will need.
The first input line contains two space-separated integers n and x (1 ≤ n ≤ 500, 1 ≤ x ≤ 105) — the initial array's length and the required median's value. The second line contains n space-separated numbers — the initial array. The elements of the array are integers from 1 to 105. The array elements are not necessarily different.
Print the only integer — the minimum number of elements Petya needs to add to the array so that its median equals x.
题目大意:给你一个数n 和一个数k,然后给你一个由n个数组成的数列,先按非递减序排好,然后让你判断这个数列的第 (n + 1) / 2 项是不是k(数列的下标从1开始),如果不是,你要往这个数列中插入m个数使插入后的数列的第(n + m + 1) / 2 项是k , 输出m的最小值。
解题思路:先判断数k是否在原数列中,没有的话就把数k加入数列,然后原始数列排序,接着找出数k在数列中第一次 first 和最后一次出现的位置second,同时算出 t =(n + 1)/ 2 ,如果 t >= first && t <= second , 就直接输出结果;如果 t < first ,则需要在数k的后面添加 大于或等于 k 的数 ;如果 t > second , 则需要在数k的前面 小于或等于 k 的数。
Ps: 此题用暴力法可能会TLE, 我用的是二分法,只是其中有许多细节需要注意。具体请看代码:
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std ;
const int MAXN = 1e5 + 5 ;
int vis[MAXN] ;
int s[MAXN] ;
bool cmp(int a , int b)
{
return a < b ;
}
int main()
{
int n , k ;
while (scanf("%d%d" , &n , &k) != EOF)
{
int i ;
int ans = 0 ;
memset(vis , 0 , sizeof(vis)) ;
for(i = 1 ; i <= n ; i ++)
{
scanf("%d" , &s[i]) ;
vis[s[i]] ++ ;
}
if(vis[k] == 0) // 如果数列中没有k,则加入k
{
vis[k] ++ ;
n ++ ;
s[n] = k ;
ans ++ ;
}
sort(s + 1, s + n + 1, cmp) ; // 因为数列的下标是从1 开始的,
//所以要把 1 ~ n 项排序
int t = (n + 1) >> 1 ;
int first = -1 ;
int second = -1 ;
int j ;
for(j = 1 ; j <= n ; j ++) // 记录 k 第一次出现的位置和最后一次出现的位置
{
if(k == s[j])
{
if(first == -1)
first = j ;
second = j ;
}
}
if(t >= first && t <= second)
{
printf("%d\n" , ans) ;
}
// 以下是二分过程,是此程序的精华,请仔细理解
else if( t < first)
{
int r = n , l = 1 , mid ;
while(r > l + 1) // 注意跳出条件
{
mid = (r + l) >> 1 ;
int tmp = (mid + n + 1) >> 1 ;
if(first < tmp )
{
r = mid - 1 ;
}
else if(first > tmp)
{
l = mid ;
}
else // 注意相等的情况也要单独判断
{
r = mid ;
}
}
if(r == l + 1) // 此处也是必不可少的 !!
{
if((l + n + 1) >> 1 == first)
{
ans += l ;
}
else
ans += r ;
}
else
ans += r ;
printf("%d\n" , ans) ;
}
// 以下过程道理同上
else
{
int r = n , l = 1 , mid ;
while (r > l + 1)
{
mid = (r + l) >> 1 ;
int tmp = (n + mid + 1) >> 1 ;
if(second + mid < tmp)
{
l = mid + 1;
}
else if(second + mid == tmp)
{
r = mid ;
}
else
{
r = mid - 1 ;
}
}
if(r == l + 1)
{
if((l + n + 1) >> 1 == second + l)
{
ans += l ;
}
else
ans += r ;
}
else
ans += r ;
printf("%d" , ans) ;
}
}
return 0 ;
}
codeforces 166C Median - from lanshui_Yang的更多相关文章
- ACM学习历程—CodeForces 590A Median Smoothing(分类讨论 && 数学)
题目链接:http://codeforces.com/problemset/problem/590/A 题目大意是给一个串,头和尾每次变换保持不变. 中间的a[i]变成a[i-1],a[i],a[i+ ...
- CodeForces 590A Median Smoothing
构造题. 答案可以o(n)构造出来.首先要发现规律.只有01交替的串才可能变化,变化规律如下: 1开头,长度为偶数(0结尾):变(len-2)/2次 变完后 前半1 后半01开头,长度为奇数(1结尾) ...
- OUC_Summer Training_ DIV2_#9 719
其实自己只会做很简单的题,有时都不想写解题报告,觉得不值得一写,但是又想到今后也许就不会做ACM了,能留下来的东西只有解题报告了,所以要好好写,很渣的题也要写,是今后的纪念. B - B Time L ...
- Codeforces Round #327 (Div. 2) C. Median Smoothing 找规律
C. Median Smoothing Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/591/p ...
- 【22.70%】【codeforces 591C】 Median Smoothing
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- Codeforces Round #327 (Div. 2) B. Rebranding C. Median Smoothing
B. Rebranding The name of one small but proud corporation consists of n lowercase English letters. T ...
- codeforces 590A A. Median Smoothing(思维)
题目链接: A. Median Smoothing time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- Median String CodeForces - 1144E
You are given two strings ss and tt, both consisting of exactly kk lowercase Latin letters, ss is le ...
- Codeforces 1005 E2 - Median on Segments (General Case Edition)
E2 - Median on Segments (General Case Edition) 思路: 首先我们计算出solve(m):中位数大于等于m的方案数,那么最后答案就是solve(m) - s ...
随机推荐
- linux core dump学习
1. core dump是什么? core dump又叫核心转储,当操作系统收到特定的signal时, 会生成某个进程的core dump文件.这样程序员可以根据 已经生成的core dump文件来d ...
- JavaScript总结(二) 系统分析
学习Javascript的时候.遇到了一个问题. 看了牛腩的视频,感觉讲的太简单和基础,像认识一位新朋友.但仅有一面之缘就结束了. 再看姜浩的视频.又看得迷迷糊糊,让我找到了当初看两位台湾专家讲VB. ...
- java foreach循环为什么不能赋值
直接上代码 public class test4 { public static void main(String args[]){ int [] a=new int[3]; for(int j:a) ...
- [CSAPP笔记][第六章存储器层次结构]
第六章 存储器层次结构 在简单模型中,存储器系统是一个线性的字节数组,CPU能够在一个常数访问每个存储器位置. 虽然是一个行之有效的模型,但没有反应现代系统实际工作方式. 实际上,存储器系统(memo ...
- Java中Thread类的start()和run()的区别
1.start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码. 通 过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪 ...
- vsim生成VCD波形文件(verilog)
Vsim(ModelSim)生成VCD波形文件(verilog) 两种方法 方法一: 调用ModelSim自己的命令生成,仿真脚本中加入如下一句即可 vcd file mytb.vcd 方法二: 调用 ...
- 给UIImage添加蒙版
http://stackoverflow.com/questions/17448102/ios-masking-an-image-keeping-retina-scale-factor-in-acco ...
- java开发之基础篇2
一.java开发环境的搭建 下载和安装jdk.版本自己看着办! 1 JAVA_HOME C:\Program Files\Java\jdk1.7.0_25 2 path C:\Program File ...
- python中的 json 模块使用
(1)python 中生成 json 字符串: import json data = dict(ret=0, msg="Welcome, Login success!") json ...
- R语言数据处理
写在前面:数据处理是数据分析与挖掘必不可少的步骤.下面列出一些常用的数据处理操作. 一.类型转换 用class()查看数据的类型,用as.类型名()进行类型转换. > num <- as. ...