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;
}