玄学?
查看原帖
玄学?
203453
Foofish楼主2020/8/21 15:35

RT

#include <bits/stdc++.h>
using namespace std;
template <typename T>inline void R(T& t){
    t=0; register char ch=getchar();
    while(!('0'<=ch&&ch<='9')){ if(ch=='-') t*=-1; ch=getchar(); }
    while(('0'<=ch&&ch<='9')){ t=((t<<1)+(t<<3))+ch-'0'; ch=getchar(); }
}
template <typename T,typename... Args> inline void R(T& t, Args&... args){R(t);R(args...);}
template <typename T>inline void W(T x){
    if(x<0) putchar('-'),x=~(x-1); int s[30],top=0; while(x) s[++top]=x%10,x/=10;
    if(!top) s[++top]=0; while(top) putchar(s[top--]+'0');
}
int n,m,ans=0x3f3f3f3f,mins[16],minv[16];
void dfs(int dep,int lastr,int lasth,int s,int v){
	if(dep==0){
		if(v==0) ans=min(ans,s);
		return;
	}
	if(s+mins[dep]>ans) return;  //最优性剪枝
	if(v<minv[dep]) return;
	if(s+2*(n-v)/lastr>ans)    return;   //加上这一句话 WA20pts,去掉 TLE70pts    我看我好像跟题解里的这句话一样,,,
	for(int r=lastr-1;r>=dep;--r){
		if(dep==m) s=r*r;
		for(int h=min(lasth-1,(v-minv[dep-1])/(r*r));h>=dep;--h)
			dfs(dep-1,r,h,s+2*r*h,v-r*r*h);
}
	}
int main()
{
	R(n,m);
	for(int i=1;i<=m;++i)
		mins[i]=mins[i-1]+i*i*2,
		minv[i]=minv[i-1]+i*i*i;
	dfs(m,sqrt(n),sqrt(n),0,n);
	cout<<((ans==0x3f3f3f3f)?0:ans)<<endl;
    return 0;
}

白名蒟蒻求救,已占一页评测。。。

2020/8/21 15:35
加载中...