题目链接
题目大意
题目意思其实很简单就是一堆数,可以加1或者减1或不变找最多能形成多少个不同数,以及最少能形成多少个不同的数。
思路
这题主要是找最小的不知道怎么写,其实可以找到一个数a就把a,a+1,a+2当作一个整体,当作一个数即可
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int n,a[maxn],x;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
a[x]++;//利用桶排的思想
}
int ans1=0,ans2=0;
for(int i=1;i<=n;i++)
{
if(a[i])
{
ans1++;
i=i+2;//直接跳到第4个数
}
}
for(int i=1;i<=n;i++)//先照顾前面再照顾后面
{
if(a[i]!=0&&a[i-1]==0)//如果前一个为0,可以把这个给前一个
{ //因为可能后一个可以给这个
a[i]--;
a[i-1]++;
}
if(a[i]>1)//如果还有两个或以上则可以给后面分一个
{
a[i]--;
a[i+1]++;
}
}
for(int i=0;i<=n+1;i++)//注意范围
{
if(a[i])
{
++ans2;
}
}
printf("%d %d",ans1,ans2);
return 0;
}