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;
}