听灌佬多
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/5 10:19
  • 上次更新2025/1/5 16:14:04
查看原帖
听灌佬多
1013979
封禁用户楼主2025/1/5 10:19

原题

程序死循环,但自己看不出问题

#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
long long a[N],tong[N],d[N],z=1; 
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		tong[a[i]]++;//桶排(求数量最多的数字) 
	}
	long long maxx=-1,x=0;//x是标准量,目标是让每个数字都为x
	for(int i=1;i<=n;i++)
	{
		if(tong[i]==maxx) z++;//查重 
		maxx=max(maxx,tong[i]);//找最大 
		x=i;
	}
	for(int i=1;i<=n;i++) d[i]=a[i]-a[i-1];//差分 
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		int l=0,r=0;
		if(a[i]!=ans) 
		{
			if(a[i+1]==x)//单个蹦 
			{
				ans+=abs(a[i]-x);
			    a[i]=x;
			}
			else//多个 
			{
				l=a[i];
				int y=0;
				while(a[i+1]!=x&&a[i]==a[i+1])//测区间长度 
				{
					y++;	
				}
			    r=l+y;
			    ans+=abs(a[i]-x);
			    d[l]+=abs(a[i]-x);//差分 
			    d[r]-=abs(a[i]-x);	
			}
		}	    
	}
	for(int i=1;i<=n;i++) a[i]=a[i-1]+d[i];//前缀和 
	cout<<ans<<endl<<z;
	return 0;
}
2025/1/5 10:19
加载中...