Codeforces 489E Hiking(普通01分数规划加DP)

来源:互联网 发布:阿尔法营软件下载 编辑:程序博客网 时间:2024/05/13 02:49

题意跟普通01分数规划差不多,就是ai变成了 ,而这个是跟你选的上一个有关系,那么判断的时候可以用一个DP数组代表从0开始停在i位置的最小ai-L×bi值,总复杂度是n^2logn。

AC代码:

//#pragma comment(linker, "/STACK:102400000,102400000")#include<cstdio>#include<ctype.h>#include<algorithm>#include<iostream>#include<cstring>#include<vector>#include<cstdlib>#include<stack>#include<cmath>#include<queue>#include<set>#include<map>#include<ctime>#include<string.h>#include<string>#include<sstream>#include<bitset>using namespace std;#define ll long long#define ull unsigned long long#define eps 1e-8#define NMAX 1000005#define MOD 1000000007#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define PI acos(-1)template<class T>inline void scan_d(T &ret){    char c;    int flag = 0;    ret=0;    while(((c=getchar())<'0'||c>'9')&&c!='-');    if(c == '-')    {        flag = 1;        c = getchar();    }    while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar();    if(flag) ret = -ret;}double dp[1005];int x[1005],b[1005],n,l,pre[1005];bool check(double p){    for(int i = 1; i <= n; i++)    {        double ha = 1005;        for(int j = 0; j < i; j++)        {            if(ha > dp[j]+sqrt(abs(l-x[i]+x[j]))-p*b[i])            {                ha = dp[j]+sqrt(abs(l-x[i]+x[j]))-p*b[i];                pre[i] = j;            }        }        dp[i] = ha;    }    if(dp[n] < 0) return true;    return false;}void print(int pos){    if(pos == 0) return;    print(pre[pos]);    printf("%d%c",pos,(pos==n)?'\n':' ');}int main(){#ifdef GLQ    freopen("input.txt","r",stdin);//    freopen("o4.txt","w",stdout);#endif // GLQ    scanf("%d%d",&n,&l);    for(int i = 1; i <= n; i++)        scanf("%d%d",&x[i],&b[i]);    double l=0,r=1005;    while(abs(r-l) > eps)    {        double mid = (r+l)/2;        if(check(mid)) r = mid;        else l = mid;    }    print(n);    return 0;}


0 0