zoukankan      html  css  js  c++  java
  • 数学(星际网络)

                                                                                                          星际网络

    • LY星系有很多个星球。它们之间通过一个巨大的互联网进行通讯。随着信息时代的发展,旧的网络已经不能满足需求,于是LY星系决定建设一个新的网络。
    • LY星系有很多个星球,有些星球一天有几十个小时,有些星球一天只有几个小时。但每个星球的一个小时都是一样长的。因此每个星球一天的长短都不一样,这就导致了一个问题:星球上的生物都是在白天工作夜晚 休息,因此每个星球每天都有上网高峰期和低峰期,当很多星球同时达到高峰期时,网络便会变得异常拥堵,进而带来延迟。所以

      LY星系需要建设一个有足够大带宽的网络来避免这一问题。现在他们想知道,网络在一个小时内的最大流量是多少。

    输入格式

    • 输入数据的第一行为一个正整数N,表示LY星系共有N个星球。
    • 接下来N行,每行描述一个星球。对于每个星球的描述,开头为两个正整数 D,T,表示这个星球一天有D个小时,当前位于T时刻(即某一天已经过去了T小时).
    • 接下来是D个正整数q0,q1....qD-1,其中qi表示第i小时到第i+1小时的流量。

    输出格式

    输出共一行,为一个整数ans,表示一个小时内的最大流量。

    样例输入

    2
    4 0 1 2 3 4
    2 0 3 1
    

    样例输出

    6
    

    数据范围与提示

    • 在4n+3时刻,流量3+3==6达到最大。
    • 对于全部的数据,N<=100000,0<=T<D<=24,qi<=1000000

    思路:首先,通过题意,我们可以发现N的范围没有多大用处,因为周期最多为24,也就是最多有24种星球,我们可以将周期相同的星球合并,最多24种;

               第二:只有两个周期互质,才总有时间使他们的周期的任意时刻重合

                (证明:设两个周期分别为6和9  周期为6:1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3

                                                                   周期为9:1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9

                    通过观察可以发现周期为6的1时刻只能与周期为9的6 3 9时刻重合,即使其实时间不同也一样,以为有公约数,所以总按一定规律循环)

                所以,这24个周期中只有13,17,19,23四个质数一定可以选择任意流量,我们可以现将这四个数的最大流量和求出加入答案,再合并周期相等的行星,暴力枚举每个时间(<=55440(1到24除去4个质数的最小公倍数)),求解

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 typedef long long ll;
     5 ll w[24+5][24+5],a[24+5];
     6 ll sum=0;
     7 void work(){
     8     ll mx=0;
     9     for(int i=1;i<=13;i++){
    10         mx=max(mx,w[13][i]);
    11     }
    12     sum+=mx;
    13     mx=0;
    14     for(int i=1;i<=17;i++){
    15         mx=max(mx,w[17][i]);
    16     }
    17     sum+=mx;
    18     mx=0;
    19     for(int i=1;i<=19;i++){
    20         mx=max(mx,w[19][i]);
    21     }
    22     sum+=mx;
    23     mx=0;
    24     for(int i=1;i<=23;i++){
    25         mx=max(mx,w[23][i]);
    26     }
    27     sum+=mx;
    28 }
    29 int main(){
    30     int n;
    31     scanf("%d",&n);
    32     for(int i=1;i<=n;i++){
    33         int d,T;
    34         scanf("%d%d",&d,&T);
    35         for(int j=1;j<=d;j++){
    36             scanf("%lld",&a[j]);
    37         }
    38         for(int st=T+1,t=1;t<=d;st++,t++){//这样写是因为每个行星的起始时间不同,下面用t做下标是为了意义对应
    39             if(st>d) st-=d;
    40             w[d][t]+=a[st];//合并周期相等的行星,
    41         }
    42     }
    43     work();
    44     ll ans=0;
    45     for(int i=1;i<=55440;i++){//暴力枚举每个时刻
    46         ll cur=0;
    47         for(int j=1;j<=24;j++){//枚举每种行星
    48             if(j==13||j==17||j==19||j==23) continue;//质数已处理
    49             int x=(i-1)%j+1;//防止模数为0
    50             cur+=w[j][x];
    51         }
    52         ans=max(ans,cur);
    53     }
    54     printf("%lld
    ",sum+ans);
    55     return 0;
    56 }
    View Code
  • 相关阅读:
    Dev 控件笔记1 repositoryItemLookUpEdit 控件
    装饰账务管理
    Tiptop ERP 采购运费一键分摊
    笔记:两数互相交换,不使用第三方变量
    .net core3.0 webapi搭建(一)
    【笔记】冒泡排序
    Mysql 几种常见的插入 Insert into,Replace Into,Insert ignore
    【转】IEnumerable接口的一个简单示例
    [转]从实例谈OOP、工厂模式和重构
    浅谈C#委托的用法-delegate[转]
  • 原文地址:https://www.cnblogs.com/HZOIDJ123/p/13340128.html
Copyright © 2011-2022 走看看