请问这样贪心有hack吗
查看原帖
请问这样贪心有hack吗
782904
哈哈人生楼主2023/9/24 10:31
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[1000005],b[1000005],ans=0,ans2=0;
bool pf(int num) {
	int w=sqrt(num);
	if(w*w==num)return 1;
	else return 0;
}
int find(int x,int y) {
	if(x==y){
		if(pf(x))return 0;
		else {
			int w=sqrt(x)+1;
			return w*w-x;
		}
	}
	if(x<y)swap(x,y);
	int w=x-y,xx,yy;
	bool pd=0;
	for(int i=1; i*i<=w; i++) {
		if(w%i!=0)continue;
		int a=i,b=w/i;
		if((a+b)%2==0) {
			xx=(a+b)/2;
			if(xx*xx<x)continue;
			yy=b-xx;
			pd=1;
			break;
		}
	}
	if(pd)return xx*xx-x;
	else return -1;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1; i<=n; i++) {
		cin>>a[i],b[i]=a[i];
	}
	for(int i=1; i<n-1; i++) {
		if(!pf(a[i]+a[i+1])) {
			int w=find(a[i],a[i+2]);
			if(w!=-1) {
				a[i+1]=w,i++;
				ans++;
			} else {
				if(pf(a[i]))a[i+1]=0;
				else {
					int w=sqrt(a[i])+1;
					a[i+1]=w*w-a[i];
				}
				ans++;
			}
		}
	}
	if(!pf(a[n-1]+a[n])) {
		if(pf(a[n-1]))a[n]=0;
		else {
			int w=sqrt(a[n-1])+1;
			a[n]=w*w-a[n-1];
		}
		ans++;
	}
	for(int i=n; i>2; i--) {
		if(!pf(b[i]+b[i-1])) {
			int w=find(b[i],b[i-2]);
			if(w!=-1) {
				b[i-1]=w,i--;
				ans2++;
			} else {
				if(pf(b[i]))b[i-1]=0;
				else {
					int w=sqrt(b[i])+1;
					b[i-1]=w*w-b[i];
				}
				ans2++;
			}
		}
	}
	if(!pf(b[2]+b[1])) {
		if(pf(b[2]))b[1]=0;
		else {
			int w=sqrt(b[2])+1;
			b[1]=w*w-b[2];
		}
		ans2++;
	}
	if(ans<ans2) {
		cout<<ans<<endl;
		for(int i=1; i<=n; i++) {
			cout<<a[i]<<" ";
		}
	} else {
		cout<<ans2<<endl;
		for(int i=1; i<=n; i++) {
			cout<<b[i]<<" ";
		}
	}
	return 0;
}

玄关。。。

2023/9/24 10:31
加载中...