CCF201809-2 買菜
試題編號: | 201809-2 |
試題名稱: | 買菜 |
時間限制: | 1.0s |
記憶體限制: | 256.0MB |
問題描述: |
問題描述 小H和小W來到了一條街上,兩人分開買菜,他們買菜的過程可以描述為,去店裡買一些菜然後去旁邊的一個廣場把菜裝上車,兩人都要買n種菜,所以也都要裝n次車。具體的,對於小H來說有n個不相交的時間段[a1,b1],[a2,b2]...[an,bn]在裝車,對於小W來說有n個不相交的時間段[c1,d1],[c2,d2]...[cn,dn]在裝車。其中,一個時間段[s, t]表示的是從時刻s到時刻t這段時間,時長為t-s。 輸入格式 輸入的第一行包含一個正整數n,表示時間段的數量。 輸出格式 輸出一行,一個正整數,表示兩人可以聊多長時間。 樣例輸入 4 樣例輸出 3 資料規模和約定 對於所有的評測用例,1 ≤ n ≤ 2000, ai < bi < ai+1,ci < di < ci+1,對於所有的i(1 ≤ i ≤ n)有,1 ≤ ai, bi, ci, di ≤ 1000000。 |
題記:
2018.11.12更新了程式碼,在這之前有些小錯誤,給讀者造成的誤導非常抱歉,以下的程式碼在官網提交過是100分。
下面給出兩個方法,個人認為都非常簡單,沒有用到複雜演算法,幾個for迴圈就搞定了:
方法一:用陣列t[]代表時間軸,先初始化為0,小H裝車對應時間段+1,小W裝車對應時間段也+1,則統計完成後t[]為2的時間說明兩人都在裝車,用time記錄t[]=2的數量即為所求。
方法二:用陣列H[]和W[]分別儲存小A和小H的裝車時間,匹配一下,統計相同時間段時長。
方法一更節省記憶體,下面給出方法一的C++程式。
方法一C++程式如下(100分):
#include <iostream> using namespace std; const int N = 1000000; int t[N];//用來儲存時間 int main(void) { int n, a, b, c, d, max=0, time=0; cin >> n;//讀入時間段數量 for(int i=0; i<N; i++){ t[i] = 0; }//把陣列初始化為零,若使用memset函式更簡潔 for(int i=0; i<n; i++){ cin >> a >> b; if(b > max) max = b; for(int j=a; j<b; j++) t[j] ++; }//輸入小H的時間段,並在對應時間段+1 for(int i=0; i<n; i++){ cin >> c >> d; if(d > max) max = d; for(int j=c; j<d; j++) t[j] ++; }//輸入小W的時間段,並在對應時間段+1 for(int i=0; i<max; i++){ if(t[i] == 2) time ++; }//若時間為2,說明該時刻兩次+1,即兩人都在裝車,可以聊天,time統計總時間 cout << time << endl;//輸出所求時間 return 0; }