zoukankan      html  css  js  c++  java
  • codeforces 1129A2-Toy Train

    传送门:QAQQAQ

    题意:有1-n个站点,成环形,有一辆运货车,在这个n个站点之间运输糖果,货车只能按照1->n的方向走,到第n个站的时候,又回到的1,现在告诉你有m个运输任务,从x站点运输一个糖果到y站点。已知货车的容量足够大,可以同时装无数个糖果,但是每一次经过一个站的时候,只能够选择其中一项任务进行运输,假设从一个站到另一个站的运输时间为1,请问从1-n每个站点作为起点,最短的运输时间分别是多少

    假设从第i个点出发要运输K个糖果,那么就要经过点iK次。所以预处理出运输完这些糖果最后停下的最近点,就是满足i点的最近距离,对所有最近距离取MAX,就是最终答案
    用t表示糖果数,p表示最近点
    (t[j]=0要判掉,因为根本不用考虑从i走到j,而且在代码中t[j]=0时p[j]=n,所以会把n*(t[j]-1)抵掉)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 int n,m,r=0;
     5 vector<int> v[6050];
     6 int p[6050],t[6050];
     7 
     8 int calc(int s,int e)
     9 {
    10     int ret=e-s;
    11     if (ret<0) ret+=n;
    12     return ret;
    13 }
    14 
    15 int main()
    16 {
    17     memset(t,0,sizeof(t));
    18     scanf("%d%d",&n,&m);
    19     for(int i=1;i<=m;i++)
    20     {
    21         int x,y;
    22         scanf("%d%d",&x,&y);
    23         v[x].push_back(y);
    24         t[x]++;
    25     }
    26     for(int i=1;i<=n;i++)
    27     {
    28         int minn=n;
    29         for(int j=0;j<(int)v[i].size();j++)
    30         {
    31             minn=min(minn,calc(i,v[i][j]));
    32         }
    33         p[i]=minn;
    34     }
    35     for(int i=1;i<=n;i++)
    36     {
    37         int ans=0;
    38         for(int j=1;j<=n;j++)
    39         {
    40             if(t[j]==0) continue;
    41             ans=max(ans,calc(i,j)+n*(t[j]-1)+p[j]);
    42         }
    43         printf("%d ",ans);
    44     }
    45     return 0;
    46 }
  • 相关阅读:
    NOIP200801 ISBN号码
    NOIP200902分数线划定
    NOIP200901多项式输出
    NOIP200603 Jam的计数法
    HDNOIP201102读数
    Modular Inverse(扩展欧几里得)
    青蛙的约会(扩展欧几里得)
    A Famous City(单调栈)
    Triangles
    2971: 魔族密码 (trie树)
  • 原文地址:https://www.cnblogs.com/Forever-666/p/10531429.html
Copyright © 2011-2022 走看看