1 条题解

  • 0
    @ 2025-8-24 22:21:29

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Utilokasteinn
    技不如人

    搬运于2025-08-24 22:21:29,当前版本为作者最后更新于2020-05-04 20:07:21,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    P6512 [QkOI#R1] Quark and Flying Pigs

    简单 DP。

    disu,vdis_{u,v} 表示从 uuvv 的最短路径,这可以用 Floyd 在 O(n3)\mathcal{O}(n^3) 的复杂度内预处理出。

    对于第 ii 只飞猪和第 jj 只飞猪,因为可以在一个点上停留,容易发现若 ti+disposi,posjtjt_i+dis_{pos_i,pos_j}\le t_j,那么人就可以在抓到 ii 之后到 jj 的位置去抓 jj

    那么就容易想到 DP。

    fif_i 表示抓住第 ii 只飞猪的前提下,前 ii 只飞猪最多可以抓几只。

    那么转移方程便容易写出,枚举 jjj<ij<i),看是否可以从 jjii,来更新答案。

    具体转移方程见代码,代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    inline int read()
    {
    	int s=0;char c=getchar();
    	for(;!isdigit(c);c=getchar());
    	for(;isdigit(c);c=getchar())
    		s=s*10+c-'0';
    	return s;
    }
    int n,m,s;
    int dis[205][205],f[5005],ans;
    struct node
    {
        int t,pos;
    }a[5001];
    bool cmp(node x,node y){return x.t<y.t;}
    int main()
    {
        n=read(),m=read(),s=read();
    	memset(dis,0x3f,sizeof(dis));
        for(int i=1;i<=m;i++)
        {
            int u=read(),v=read(),w=read();
    		dis[u][v]=dis[v][u]=w;
        }
    	for(int i=1;i<=n;i++)
    		dis[i][i]=0;
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
        for(int i=1;i<=s;i++)
    		a[i].t=read(),a[i].pos=read();
        sort(a+1,a+s+1,cmp);
        a[0].pos=1;//时刻为0的时候,人在位置1
        for(int i=1;i<=s;i++)
            for(int j=0;j<i;j++)
                if(dis[a[i].pos][a[j].pos]+a[j].t<=a[i].t)
                    f[i]=max(f[i],f[j]+1);
    	for(int i=1;i<=s;i++)
    		ans=max(ans,f[i]);
        printf("%d\n",ans);
        return 0;
    }
    
    • 1

    信息

    ID
    3682
    时间
    1000ms
    内存
    128MiB
    难度
    4
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者