数学(星际网络)

                                                                                                      星际网络

  • 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\n",sum+ans);
55     return 0;
56 }
View Code

 

posted @ 2020-07-19 16:19  ddoodd  阅读(240)  评论(0编辑  收藏  举报