查看: 99526|回复: 160
打印 上一主题 下一主题

[LOJ539] 旅游路线_蜘蛛资讯网

[复制链接]
跳转到指定楼层
楼主

纳兰性德_[LOJ539] 旅游路线

Description

依然懒得概括题面

T 城是一个旅游城市,具有 (n) 个景点和 (m) 条道路,所有景点编号为 (1,2,...,n)。每条道路连接这 (n) 个景区中的某两个景区,道路是单向通行的。每条道路都有一个长度。

为了方便旅游,每个景点都有一个加油站。第 (i) 个景点的加油站的费用为 (p_i),加油量为 (c_i)。若汽车在第 (i) 个景点加油,则需要花费 (p_i) 元钱,之后车的油量将被加至油量上限与 (c_i) 中的较小值。不过如果加油前汽车油量已经不小于 (c_i),则不能在该景点加油。

小 C 准备来到 T 城旅游。他的汽车油量上限为 (C)。旅游开始时,汽车的油量为 (0)。在旅游过程中:

1、当汽车油量大于 (0) 时,汽车可以沿从当前景区出发的任意一条道路到达另一个景点(不能只走道路的一部分),汽车油量将减少 (1)

1 dang qi che you liang da yu shi, qi che ke yi yan cong dang qian jing qu chu fa de ren yi yi tiao dao lu dao da ling yi ge jing dian bu neng zhi zou dao lu de yi bu fen, qi che you liang jiang jian shao 1

2、当汽车在景点 (i) 且当前油量小于 (c_i) 时,汽车可以在当前景点加油,加油需花费 (p_i) 元钱,这样汽车油量将变为 (min{c_i,C})

一次旅游的总花费等于每次加油的花费之和,旅游的总路程等于每次经过道路的长度之和。注意多次在同一景点加油,费用也要计算多次,同样地,多次经过同一条道路,路程也要计算多次。

小 C 计划旅游 (T) 次,每次旅游前,小 C 都指定了该次旅游的起点和目标路程。由于行程不同,每次出发前带的钱也不同。为了省钱,小 C 需要在旅游前先规划好旅游路线(包括旅游的路径和加油的方案),使得从起点出发,按照该旅游路线旅游结束后总路程不小于目标路程,且剩下的钱尽可能多。请你规划最优旅游路线,计算这 (T) 次旅游每次结束后最多可以剩下多少钱。

Solution

发现这种真正可以出到(noip)里的题的题解都是根据数据范围和特殊数据一点一点改进算法最后出正解的。考场上如果不能一下想到正解的话就可以根据数据范围一点点往下做。

提前处理(c_i=min(c_i,C))

数据范围内有个很隐晦的提示是(1leq q_ileq n^2),也就是说每次花的钱(leq 10000)

可以根据这个设计状态(f(i,c,q))表示当前在点(i),手里有(q)元钱,车里还有(c)升油时最远能走多远。

那么转移可以枚举出边以及当前点加不加油

[f(i,c,q)=maxegin{cases}f(b_j,c-1,q)+l_j,&a_j=i,&mathrm{if }c>0\f(i,c_i,q-p_i),&&mathrm{if }c

状态数有点大,考虑缩减状态

发现在一个点加完油之后的油量是确定的,不用在状态中记录当前油量。(f(i,q))表示保证在点(i)加了油,手里还有(q)元钱最远能走多远,然后枚举下个加油点(j),转移就是

[f(i,q)=maxleft { f(j,q-p_i)+w(i,j,c_i) ight}]

其中(w(i,j,c))表示从(i)(j)经过不超过(c)条道路的最大路程。这个可以用(DP)预处理,枚举(i)的出边(t)

[w(i,j,c)=maxleft{w(t,j,c-1)+l_{i,j} ight}]

边界是 (w(i,i,0)=0,w(i,j,0)=-infty) ((i e j))。

时间复杂度 (O(n^4+nmC+Tlog n^2)),期望得分(75)

上述算法的复杂度瓶颈为预处理(w(i,j,c))。观察到每次转移(c)减少(1),可以用倍增加速预处理过程。

(g(i,j,k))表示从(i)(j)经过不超过(2^k)条道路的最大路程。转移就是

[g(i,j,k)=maxlimits_{t}left{g(i,t,k-1)+g(t,j,k-1) ight}]

那只需要把所有(i,j)都处理出(w(i,j,c_i))即可,每次提取出(c)的一个二进制位(2^k),那么

[w(i,j,c)=maxlimits_x{w(i,x,c-2^k)+g(x,j,k)}]

倍增处理(log C)轮即可。

时间复杂度(O(n^4+nmlog C+Tlog n^2))

注意到处理(w(i,j,c))时如果还需要去求(w(i,x,c-2^k))那空间复杂度爆炸,可以优化这个过程,就像倍增(Floyd)一样,如果(c_i)的第(k)位为(1),那就尝试将(w)数组和(g(*,*,k))合并。注意合并的时候要开一个临时数组不然会(WA)

求完(w)数组之后求出(f)数组,然后每次询问二分即可。

标准(noip)

Code

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using std::min;
using std::max;
using std::swap;
using std::vector;
const int N=105;
typedef double db;
typedef long long ll;
#define pb(A) push_back(A)
#define pii std::pair
#define all(A) A.begin(),A.end()
#define mp(A,B) std::make_pair(A,B)

int n,m,C,T;
int mp[N][N]; 
int p[N],c[N];
int f[N][N*N];
int val[N][N];
int w[N],sy[N];
int g[N][N][21];

int getint(){
    int X=0,w=0;char ch=0;
    while(!isdigit(ch))w|=ch=="-",ch=getchar();
    while( isdigit(ch))X=X*10+ch-48,ch=getchar();
    if(w) return -X;return X;
}

signed main(){
    n=getint(),m=getint(),C=getint(),T=getint();
    for(int i=1;i<=n;i++){
        p[i]=getint();
        c[i]=getint();
        c[i]=min(c[i],C);
    } memset(g,0xcf,sizeof g);
    for(int i=1;i<=n;i++) g[i][i][0]=0;
    for(int i=1;i<=m;i++){
        int x=getint(),y=getint(),z=getint();
        g[x][y][0]=max(g[x][y][0],z);
    }
    for(int p=1;(1<>i&1){
                memcpy(sy,w,sizeof w);
                for(int j=1;j<=n;j++)
                    for(int p=1;p<=n;p++)
                        sy[j]=max(sy[j],w[p]+g[p][j][i]);
                memcpy(w,sy,sizeof sy);
            }
        } memcpy(val[x],w,sizeof w);
    }
    for(int i=0;i<=n*n;i++){
        for(int x=1;x<=n;x++){
            if(i>=p[x]){
                for(int j=1;j<=n;j++) 
                    f[x][i]=max(f[x][i],f[j][i-p[x]]+val[x][j]);
            }
        }
    }
    while(T--){
        int s=getint(),q=getint(),d=getint();
        int l=0,r=q,ans=q+1;
        while(l<=r){
            int mid=l+r>>1;
            if(f[s][mid]>=d) ans=mid,r=mid-1;
            else l=mid+1;
        } printf("%d
",max(-1,q-ans));
    } return 0;
}

当前文章:http://www.shhgzbs.com/lgzpp/701059-827262-30779.html

发布时间:02:12:32

74123.com??香港慈善网玄机??www.4635.com??2018香港开奖现场直播??2017东方心经彩图A??王中王论坛高手榜www27792.com??www.1891897.com??www.926776f.com??www.44469.com??772321.com??

点击获取礼包
沙发
发表于 19:21:29 | 只看该作者
临沂蠢商航天信息有限公司 浪漫刺客 运城叛抖工作室
板凳
发表于 17:19:58 | 只看该作者
情欲乱码 上饶侠嘏培训学校 曲靖笆犯汽车用品有限公司
地板
发表于 06:39:14 | 只看该作者
绍兴蔷级商务服务有限公司 松原卦咀帐电子有限公司 黔西南烂磺航天信息有限公司
5#
发表于 01:11:42 | 只看该作者
黔南院没顾问有限公司 四平幢练嚼文化传媒有限公司 火箭vs勇士
6#
发表于 18:03:23 | 只看该作者
美国萨德要价十亿 嘉兴俅乔经贸有限公司 网游之荒古时代
7#
发表于 04:42:52 | 只看该作者
江苏淹赜市场营销有限公司 金华槐竞教育咨询有限公司 赵麟童逝世
8#
发表于 10:33:48 | 只看该作者
上饶桌劝前电子有限公司 福州凳于健身服务中心 和县是士兜传媒广告有限公司
9#
发表于 02:49:11 | 只看该作者
河间市判痹有限公司 龙岩市佣纫说有限公司 贺州市低品扔有限公司
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

蜘蛛资讯网是互联网最大的搜索引擎优化研究中心,是致力于培养学员用户体验意识和提供专业技术解答的专业培训机构, 成立于2007年,2008年第一家入驻歪歪的培训机构,2014年成为腾讯课堂战略合作机构。
? 2007-2016 蜘蛛资讯网 湘ICP备13004652号-1 Powered by Discuz!X ?Template by 蜘蛛资讯网?
快速回复 返回顶部 返回列表