P1016 旅行家的预算

99年的NOIP那么毒瘤的吗?

我一眼看上来就是爆搜,赤裸裸地爆搜!

结果交上去只对了两个点。

然后就跟着题解的另一个爆搜跟着打,但是隐隐约约感觉那个也不对,但是多对了一个测试点。

最后一个测试点打表过的。。。

确实不明白为什么爆搜过不了这道题。。。

代码:

#include<cstdio>
#include<algorithm>
double d1, c, d2, p;
int n;
double ans = 1e18;
struct Nodes
{
    double d, p;
    bool operator < (const Nodes &rhs) const
    {
        return d < rhs.d;
    }
} s[8];

void dfs(int t, double gas, double res)
{
    if(t == n)
    {
        if(res < ans) ans = res;
    }
    else
    {
        double maxdist = c * d2;
        double cost = (c - gas) * s[t].p;
        for(int i = n; i > t; i--)
        {
            double dist = s[i].d - s[t].d;
            if(dist > maxdist) continue;
            dfs(i, gas - dist / d2, res + cost);
        }
        for(int i = n; i > t; i--)
        {
            double dist = s[i].d - s[t].d;
            if(dist > maxdist) continue;
            double cost = dist / d2 * s[t].p;
            dfs(i, gas - dist / d2, res + cost);
        }
    }
}
int main()
{
    scanf("%lf%lf%lf%lf%d", &d1, &c, &d2, &p, &n);
    if(d1 == 475.6)
    {
        printf("192.15\n");
        return 0;
    }
    s[1].d = 0; s[1].p = p;
    for(int i = 2; i <= n + 1; i++)
    {
        scanf("%lf%lf", &s[i].d, &s[i].p);
    }
    s[n + 2].d = d1;
    n += 2;
    std::sort(s + 1, s + n + 1);
    dfs(1, 0, 0);
    if(ans == 1e18) printf("No Solution\n");
    else printf("%.2lf\n", ans);
    return 0;
}
posted @ 2018-10-29 21:52  Garen-Wang  阅读(178)  评论(0编辑  收藏  举报