CodeForces - 1283E. New Year Parties (贪心)

题目大意:

n个数每个数有一个位置x[i] 你可以对每个数操作将他移动到x[i]+1或者x[i]-1或者不动
问你最多占据的位置和最少占据的位置

题目思路:

求最多位置时:
我们对x数组进行排序后,位置关系是递增的
对于当前x[i] 如果x[i]-1不存在,我们优先选择填充x[i]-1
因为随之x[i] 的增大 x[i]-1这个位置将不再能移动到
如果x[i]-1存在那么次优先填充x[i]
原因同上
求最少位置时:
对于序列 4 4 5 5 6 7 8 9 9
求最少时候只需要看成 4 5 6 7 8 9 就行了
因为一个数可以覆盖+1或者-1的位置
所以直接枚举a[i]作为七点,那么只要小于等于a[i]+2的都被覆盖
超过之后 创建新的起点 ans2++

Code:

int n,a[maxn],num[maxn],b[maxn],cnt,ans2,ans1,dp[maxn],vis[maxn];
int main() {
    
    
	n=read();
	rep(i,1,n) a[i] = read(),num[a[i]]++;
	rep(i,1,n) if(num[i]) b[++cnt] = i;
	sort(a+1,a+1+n);
	int minn = a[1];
	ans1=1;
	for(int i=1  ; i<=cnt ; i++) {
    
    
		int t = b[i];
		if(abs(t-minn)<=2)	vis[t] =1 ;
		else ans1++,minn = t;
	}
	mst(vis,0);
	for(int i=1 ; i<=n ; i++) {
    
    
		int t = a[i];
		if(vis[t-1]==0) vis[t-1] =1 ,dp[i] = dp[i-1]+1;
		else if(vis[t]==0) vis[t]=1,dp[i] = dp[i-1]+1;
		else if(vis[t+1]==0) vis[t+1]=1,dp[i] = dp[i-1]+1;
		else dp[i] = dp[i-1]; 
	}
	ans2 = dp[n];
	cout<<ans1<<" "<<ans2<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wmy0536/article/details/110964431