题目链接:http://poj.org/problem?id=1190
题看上去确实很复杂
涉及到半径面积这些,其实看着真的很头疼
但是除去这些就是剪枝优化的dfs算法
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> #include<queue> #include<utility> #include<stack> #include<cstdlib> #define ll long long #define inf 0x3fffffff #define maxn 10005 #define maxm 30 using namespace std; int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } void fre(){ freopen(" .in","r",stdin); freopen(" .out","w",stdout); } int lminQ[maxm], lminV[maxm]; int min_Q; int n,m; void dfs(int V, int Q, int step, int r, int h){ if(step==0){ if(V==n)min_Q=min(min_Q,Q); return; } if(V+lminV[step]>n || Q+lminQ[step]>min_Q)return; if(2*(n-V)/r+Q>=min_Q)return; int max_R=r-1; for(int i=max_R; i >= step; i--){ if(step==m)Q=i*i; int max_H=min(((n-lminV[step-1]-V)/(i*i)), h-1); for(int j=max_H; j >= step; j--) dfs(V+i*i*j, Q+2*i*j, step-1, i, j); } } int main(){ n=read();m=read(); lminQ[0]=0,lminV[0]=0; for(int i=1;i<22;i++) lminQ[i]=lminQ[i-1]+2*i*i,lminV[i]=lminV[i-1]+i*i*i; min_Q=inf; dfs(0,0,m,100,10000); if(min_Q<inf)cout<<min_Q<<endl; else cout<<0<<endl; return 0; }
题不错
下次再来思考思考
这次借鉴了其他博主的思路
不全是自己想的