没有玄学,只有细节

很有幸地发现了洛谷的大牛分站,看到里面东西都奇奇怪怪的,觉得特别神奇,于是点了个随机跳题,就这样来到了一个号称“提高+,省选”难度的题(⊙o⊙)…

接下来看题目

P1731 生日蛋糕

题目背景

7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层

生日蛋糕,每层都是一个圆柱体。

设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i

  for(int i=1;i<=m;i++){
        minv[i]=minv[i-1]+i*i*i;
        mins[i]=mins[i-1]+2*i*i;
    }

于是忽然领悟自己一开始之所以不会搜是因为没有注意到整数二字的猥琐性(⊙o⊙)…
便自己写了一个深搜

void dfs(int sumv,int sums,int r,int h,int pos)
{
    if(pos==0)
    {
        if(sumv==n)
            ans=gsmin(sums,ans);
        return;
    }
    if(sumv+minv[pos]>n)return;//体积超值 
    if(sums+mins[pos]>ans)return;//面积已经不最小 
    if(2*(n-sumv)/r+sums>=ans)return;//之后都取最小结果比ans大 
    for(int i=r-1;i>=pos;i--)
    {//用循环挨个搜索上一层的半径 i 
        if(pos==m)  sums=i*i;
        //如果是第一层,sums=0,需要来个初始值
        int temp=gsmin((n-minv[pos-1]-sumv)/i/i,h-1);
        //上一层高度最小值temp
        for(int j=temp;j>=pos;j--)//上一层高度 j 
            dfs(sumv+i*i*j,sums+2*i*j,i,j,pos-1);
    }
}

诶…?加个主函数就给过了!
哇,我好棒棒!

【hh,然而并没有,,,,,一开始dfs最后地推的时候i和j写反了…….

嗯,那就把完整代码附上:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,s,ans=0x3f3f3f3f;
int minv[25],mins[25];
int gsmin(int a,int b);
void dfs(int sumv,int sums,int r,int h,int pos)
{
    if(pos==0)
    {
        if(sumv==n)
            ans=gsmin(sums,ans);
        return;
    }
    if(sumv+minv[pos]>n)return;//体积超值 
    if(sums+mins[pos]>ans)return;//面积已经不最小 
    if(2*(n-sumv)/r+sums>=ans)return;//之后都取最小结果比ans大 
    for(int i=r-1;i>=pos;i--)
    {//用循环挨个搜索上一层的半径 i 
        if(pos==m)  sums=i*i;
        //如果是第一层,sums=0,需要来个初始值
        int temp=gsmin((n-minv[pos-1]-sumv)/i/i,h-1);
        //上一层高度最小值temp
        for(int j=temp;j>=pos;j--)//上一层高度 j 
            dfs(sumv+i*i*j,sums+2*i*j,i,j,pos-1);
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        minv[i]=minv[i-1]+i*i*i;
        mins[i]=mins[i-1]+2*i*i;
    }
    dfs(0,0,n+1,n+1,m);
    cout<<ans;
}
int gsmin(int a,int b)
{
    if(a<b) return a;
    else return b;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoesM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值