关于本题的运气成分
查看原帖
关于本题的运气成分
416975
sbno333楼主2024/1/12 00:11

本题过度优化过不了数据,

70分代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int ans=1e10;
int m;
int m1[19];
int m2[19];
void dfs(int x,int y,int sum,int xx,int yy){
	//cout<<x<<" "<<y<<" "<<sum<<" "<<xx<<" "<<yy<<endl;
	
	if(y==0){
		if(x==y){
			ans=min(ans,sum);
			return;
		}
		return;
	}
	if(x<m1[y-1]){
		return;
	}
	if(sum+m2[y-1]>=ans||x*2/xx+sum>=ans){
		return;
	}
	for(int i=y;i<=xx;i++){
		int sb;
		sb=x-m1[y-1];
		sb=sb/i/i;
		sb=min(sb,yy);
		for(int j=y;j<=sb;j++){
			dfs(x-j*i*i,y-1,sum+j*i*2+(y==m?1:0)*i*i,i-1,j-1);
		}
	}
}
signed main(){
	int n;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		m1[i]=m1[i-1]+i*i*i;
		m2[i]=m2[i-1]+2*i*i;
	}
	int st;
	st=sqrt(n);
	dfs(n,m,0,sqrt(n),n);
	cout<<(ans>=1e9?0:ans);
	return 0;
}

不幸的是,我只改了一行,就对了,你猜猜哪一行?

#include<bits/stdc++.h>
using namespace std;
#define int long long
int ans=1e10;
int m;
int m1[19];
int m2[19];
void dfs(int x,int y,int sum,int xx,int yy){
	//cout<<x<<" "<<y<<" "<<sum<<" "<<xx<<" "<<yy<<endl;
	
	if(y==0){
		if(x==y){
			ans=min(ans,sum);
			return;
		}
		return;
	}
	if(x<m1[y-1]){
		return;
	}
	if(sum+m2[y-1]>=ans||x*2/xx+sum>=ans){
		return;
	}
	for(int i=xx;i>=y;i--){//换个顺序,就对了,可能是提前获得了答案能够减去更多枝杈,也不知道是不是数据的问题
		int sb;
		sb=x-m1[y-1];
		sb=sb/i/i;
		sb=min(sb,yy);
		for(int j=y;j<=sb;j++){
			dfs(x-j*i*i,y-1,sum+j*i*2+(y==m?1:0)*i*i,i-1,j-1);
		}
	}
}
signed main(){
	int n;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		m1[i]=m1[i-1]+i*i*i;
		m2[i]=m2[i-1]+2*i*i;
	}
	int st;
	st=sqrt(n);
	dfs(n,m,0,sqrt(n),n);
	cout<<(ans>=1e9?0:ans);
	return 0;
}

崩溃了,题解没有一个说的,建议加。

2024/1/12 00:11
加载中...