Codeforces 1283E New Year Parties

题目链接:

Codeforces 1283E New Year Parties

思路:

1.求最小:如果一个房子有人,那么包含它的连续三个房子至少有一个人,那么采用贪心思想,从前往后扫,如果房子有人,那么就判定连着的三个房子有一个人;
2.求最大:一段长为n的连续有人区间,如果总人数为n+1,那么这段区间可以向左给出一个人,如果总人数大于n+1,则又可以向右给出一个人;那我们采用贪心思想,从前往后扫整个区间(注意整个区间范围),如果该房子没有人且前面房子有人,则我们将前面一个房子移一个人过来,如果当前区间有大于一个人,则往后移;

代码:

#include<bits/stdc++.h>

using namespace std;

const int maxn=2e5+5;
int n,a[maxn];

int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		int x; scanf("%d",&x); ++a[x];
	}
	int ans1=0,ans2=0;
	for(int i=1;i<=n;i++) if(a[i]) ++ans1,i+=2;
	for(int i=0;i<=n;i++){    //pay attention the section is [0,n+1]
		if(a[i]==0&&a[i+1]) ++a[i],--a[i+1];
		else if(a[i]>=2) --a[i],++a[i+1];
	}
	for(int i=0;i<=n+1;i++) if(a[i]) ++ans2;
	printf("%d %d",ans1,ans2);
	return 0;
}
posted @ 2019-12-30 23:30  YuhanのBlog  阅读(98)  评论(0编辑  收藏  举报