題目不少于5個字,所以整了個括號湊字數
首先我想到的是用一個數組來記錄每一秒的在線人數
但是即使是short類型(2字節),也會用到60 * 60 * 24 * 30 * 12 * 60 * 2 / 1024 / 1024 =?3,559.5703125 MB
而題目上限是256MB,超了,雖然時間復雜度是O(n)
第二個想到的是一個一個處理數據,用一個數組記錄目前的時間區間,如果新數據沒有和目前的時間區間重合,就新創建一個,如果重合,該時間區間就縮小到重合部分,而該時間區間的重合數加一
這個方法的時間復雜度最低是O(n)最高是O(n * (n + 1) / 2)
但是這個方法不可行,因為記錄的時間區間是不斷縮小的,如果有新的時間區間和舊的記錄的較大的時間區間重合的話,之前的重合數就沒有記錄下來
如[1,5), [4,5), [1,2), [1,2),答案是3,而按這個方法計算是2
所以每一個時間區間都要比較
設置一個臨時的時間區間,一一等于每一個時間區間,然后在每一輪對所有的時間區間進行比較
而且不斷縮小到重合部分,記錄重合數,對所有的重合數取最大值,就是答案了
時間復雜度是O(n ^ 2)
代碼如下:
#include<stdio.h>
struct Time{int A;int B;
}time[1000];
int jud(int A1, int B1, int A2, int B2);int main(void)
{int n, maxn = 0;scanf("%d", &n);for(int i = 0; i < n; i++)scanf("%d%d", &time[i].A, &time[i].B);for(int i = 0; i < n; i++){struct Time tmp;int count = 0;tmp.A = time[i].A, tmp.B = time[i].B;for(int j = 0; j < n; j++)if(jud(time[j].A, time[j].B, tmp.A, tmp.B)){tmp.A = (tmp.A > time[j].A) ? tmp.A : time[j].A;tmp.B = (tmp.B < time[j].B) ? tmp.B : time[j].B;count++;}maxn = (maxn > count) ? maxn : count;}printf("%d", maxn);return 0;
}
int jud(int A1, int B1, int A2, int B2)
{if(B1 <= A2 || A1 >= B2)return 0;return 1;
}