求贪心算法错误点
查看原帖
求贪心算法错误点
419180
zhouguanxu楼主2021/12/17 11:44

原代码,前面思路和题解相同,只是使用dp的时候换成了贪心 wa了 #11

#include<bits/stdc++.h>
#define int long long 
using namespace std;
typedef long long ll;

inline int read()
{
	int f=0,a=0;char c=getchar();
	while(!isdigit(c))f|=c=='-',c=getchar();
	while(isdigit(c))a=(a<<1)+(a<<3)+c-'0',c=getchar();
	return f ? -a:a;
}

inline void write(int a)
{
	if(a<0)putchar('-'),a=-a;
	if(a>9)write(a/10);
	putchar(a%10+'0');
}

const int N=1e4+3;
int num[N];
int cha[N];
int n;
ll sum;
ll res,resp;
int maxx,minn,Mid;
queue<int> que;

signed main()
{
	n=read();
	for(int i=0;i<n;i++)
	{
		num[i]=read();
		if(i!=0)
		cha[i-1]=num[i]-num[i-1];
	}
	
	sort(cha,cha+n-1);
	
	
	
	for(int Mid=1;Mid<=num[n-1];Mid++)
	{
		
		res=0;
		maxx=num[n-1];
		minn=num[0];
	
		sum=minn+maxx;	
	
		que.push(maxx*n);
		que.push(minn*n);
		int left=0,right=0;
		for(int i=n-2;i>=1;--i)
		{
			if((Mid-minn>maxx-Mid&&minn+cha[i]<Mid)||(maxx-cha[i]<Mid))
			{
				minn=minn+cha[i];
					
				sum+=minn;
				que.push(minn*n);
				left+=cha[i];
			}
			else
			{
				maxx=maxx-cha[i];
				
				sum+=maxx;
				que.push(maxx*n);
				right+=cha[i];
			}		
		}
		
		while(que.size())
		{
			res+=(que.front()-sum)*(que.front()-sum);
			que.pop(); 
		}
		if(Mid==1)resp=res;
		resp=min(res,resp);
	}
	
	
	printf("%lld",resp/n);
	return 0;
}
2021/12/17 11:44
加载中...