数学(星际网络)
星际网络
- 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 }