Codeforces Round #611 (Div. 3) E. New Year Parties (贪心)

题目链接
在这里插入图片描述
在这里插入图片描述
题意:给定一个初始序列,规定可以对序列的每个元素进行+1、-1或者不变的操作,一顿操作过后,序列不同元素的个数为X,求x的最大和最小值
思路:求最小值容易想,可以先排序再去重,只要有一段元素比如1,2,3是连续且相差为1的肯定可以合并在一起,但是这里有个漏洞,就是比如2 4其实也是可以合并在一起的,把这个条件加上就行。
至于求最大值的话,可以先统计每个数的个数,然后枚举每个数,只要左边有空位就往左边移,如果自己还有多的就往右边移。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
typedef long long ll;
int n,a[maxn],b[maxn],maxx=0,num[maxn]={0},ans;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]),b[i]=a[i],maxx=max(maxx,a[i]),num[b[i]]++; 
	sort(a+1,a+1+n);
	sort(b+1,b+1+n);
	int size=unique(a+1,a+1+n)-a-1;
	int j=1;
	a[size+1]=1e6,a[size+2]=1e9;
	while(j<=size)
	{
		if(a[j+2]-a[j+1]==1&&a[j+1]-a[j]==1) j+=3;
		else if(a[j+1]-a[j]==1) j+=2;
		else if(a[j+1]-a[j]==2) j+=2;
		else j++;
		ans++;
	}
	printf("%d ",ans);
	ans=0;
	for(int i=1;i<=n+1;++i)
	{
		if(num[i]==0) continue;
		if(num[i-1]==0) num[i]--,num[i-1]++;
		if(num[i]>1) num[i]--,num[i+1]++;
	}
	for(int i=0;i<=maxx+1;++i) if(num[i]) ans++; 
	printf("%d\n",ans);
}
发布了70 篇原创文章 · 获赞 0 · 访问量 2432

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/104232781