第三个测试点wa
输入:
87.75 13.03 5.75 7.29 3
22.10 7.38
24.21 6.81
82.08 6.96
输出:
std:105.95
me:104.18
大体思路:递归+贪心
code:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
double d1,c,d2,p,dis[10],pri[10];
int n;
double ans=INF;
void dfs(int u,double cost1,double cost2,double E,double add) {
if(double((d1-dis[u])*1.0/d2)<=E) {
ans=min(ans,cost1);
}
else if(double((d1-dis[u])*1.0/d2)<=c) {
ans=min(ans,cost1+(double((d1-dis[u])*1.0/d2)-E)*pri[u]);
}
for(int i=u+1;i<=n;i++) {
if(double((dis[i]-dis[u])*1.0/d2)<=E) {
if(pri[u]<pri[i]) {
dfs(i,cost1+(c-E)*pri[u],cost2+double((dis[i]-dis[u])*1.0/d2),c-double((dis[i]-dis[u])*1.0/d2),add+c-E);
}
else {
dfs(i,cost1,cost2+double((dis[i]-dis[u])*1.0/d2),E-double((dis[i]-dis[u])*1.0/d2),add);
}
}
else if(double((dis[i]-dis[u])*1.0/d2)<=c) {
if(pri[u]<pri[i]) {
dfs(i,cost1+(c-E)*pri[u],cost2+double((dis[i]-dis[u])*1.0/d2),c-double((dis[i]-dis[u])*1.0/d2),add+c-E);
}
else {
dfs(i,cost1+(double((dis[i]-dis[u])*1.0/d2)-E)*pri[u],cost2+double((dis[i]-dis[u])*1.0/d2),E,add+double((dis[i]-dis[u])*1.0/d2)-E);
}
}
}
}
int main() {
scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&p,&n);
dis[0]=0,pri[0]=p;
for(int i=1;i<=n;i++) {
scanf("%lf%lf",&dis[i],&pri[i]);
}
dfs(0,0,0,0,0);
if(ans==INF) printf("No Solution");
else printf("%.2lf",ans);
return 0;
}