《寒假每日一题》2022/1/3 AcWing 2041. 干草堆

原题链接:https://www.acwing.com/problem/content/2043/

Problem Description:

贝茜对她最近在农场周围造成的一切恶作剧感到抱歉,她同意帮助农夫约翰把一批新到的干草捆堆起来。

开始时,共有 N 个空干草堆,编号 1∼N。

约翰给贝茜下达了 K 个指令,每条指令的格式为 A B,这意味着贝茜要在 A..B 范围内的每个干草堆的顶部添加一个新的干草捆。

例如,如果贝茜收到指令 10 13,则她应在干草堆 10,11,12,13 中各添加一个干草捆。

在贝茜完成了所有指令后,约翰想知道 N 个干草堆的中值高度——也就是说,如果干草堆按照高度从小到大排列,位于中间的干草堆的高度。

方便起见,N 一定是奇数,所以中间堆是唯一的。

请帮助贝茜确定约翰问题的答案。

Input:

第一行包含 N 和 K。

接下来 K 行,每行包含两个整数 A,B,用来描述一个指令。

Output:

输出完成所有指令后,N 个干草堆的中值高度。

Sample Input:

7 4
5 5
2 4
4 6
3 5


Sample Output:

1


解题思路:

  • 差分+sort
  • 不知道差分的话,简单地遍历数组会超时

代码讲解:

  • sort() c++自带的排序,很好用

AC代码:

#include<bits/stdc++.h>
using namespace std;

const int N=1000010; 
int n,k;
int b[N];  //差分数组

void insert(int l,int r)
{
	b[l]+=1;
	b[r+1]-=1;	
} 

int main( )
{
	scanf("%d%d",&n,&k);
	while(k--)    //k次询问
	{
		int a,b;
		scanf("%d%d",&a,&b);	
		insert(a,b);		//进行差分 
	}
	for(int i=1;i<=n;i++)
		b[i]+=b[i-1];		//求前缀和 
	sort(b+1,b+n+1); 		//sort进行排序 
	printf("%d",b[n/2+1]);  //输出中位数 
	return 0;
}
posted @ 2022-01-05 17:03  白也_y  阅读(68)  评论(0)    收藏  举报