1. 程式人生 > >CCF計算機職業資格認證考試 201809-2 買菜

CCF計算機職業資格認證考試 201809-2 買菜

stream 朋友 職業 iostream 正整數 i++ 輸入格式 lap 時長

以下內容過於幼稚,請大佬自覺繞道。。

題目描述:

時間限制:
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,表示時間段的數量。
  接下來n行每行兩個數ai,bi,描述小H的各個裝車的時間段。
  接下來n行每行兩個數ci,di,描述小W的各個裝車的時間段。
輸出格式
  輸出一行,一個正整數,表示兩人可以聊多長時間。
樣例輸入
4
1 3
5 6
9 13
14 15
2 4
5 7
10 11
13 14
樣例輸出
3
數據規模和約定
  對於所有的評測用例,1 ≤ n ≤ 2000, ai < bi < ai+1,ci < di < ci+1,對於所有的i(1 ≤ i ≤ n)有,1 ≤ ai, bi, ci, di ≤ 1000000。

1、樸素解,適用於所有情況

技術分享圖片
 1 #include<iostream>
 2 using namespace std;
 3 int main(){
 4     int n;
 5     cin>>n;
 6     int a[n],b[n],c[n],d[n];
 7     for(int i=0;i<n;i++){
 8         cin>>a[i]>>b[i];
 9     }
10     for(int i=0;i<n;i++){
11         cin>>c[i]>>d[i];
12 } 13 int count=0; 14 int i=0,j=0; 15 while(i<n&&j<n){ 16 if(a[i]<=c[j]){ 17 if(b[i]<=d[j]&&b[i]>c[j]) { 18 count+=b[i]-c[j];i++; 19 } 20 else { 21 if(b[i]<=c[j]) i++; 22 else{ 23 count+=d[j]-c[j];j++; 24 } 25 } 26 27 } 28 else{ 29 if(b[i]>=d[j]&&d[j]>a[i]){ 30 count+=d[j]-a[i];j++; 31 } 32 else{ 33 if(d[j]<=a[i]) j++; 34 else{ 35 count+=b[i]-a[i];i++; 36 } 37 38 } 39 } 40 41 } 42 cout<<count; 43 return 0; 44 }
View Code

2、將問題總結一下後

技術分享圖片
 1 #include<iostream>
 2 using namespace std;
 3 int main(){
 4     int n;
 5     cin>>n;
 6     int a[n],b[n],c[n],d[n];
 7     for(int i=0;i<n;i++){
 8         cin>>a[i]>>b[i];
 9     }
10     for(int i=0;i<n;i++){
11         cin>>c[i]>>d[i];
12     }
13     int count=0;int x,y;
14     for(int i=0;i<n;i++){
15         for(int j=0;j<n;j++){
16             count+=max(0,min(b[i],d[j])-max(a[i],c[j]));
17         }
18     }
19     cout<<count;
20     return 0;
21 }
View Code

3、最易理解的,最巧妙的

技術分享圖片
 1 #include<iostream>
 2 using namespace std;
 3 int ojbk[1000000];    
 4 int main(){
 5     int n;
 6     cin>>n;
 7     int a[n],b[n],c[n],d[n];
 8     for(int i=0;i<1000000;i++){
 9         ojbk[i]=0;
10     }
11     for(int i=0;i<n;i++){
12         cin>>a[i]>>b[i];
13         for(int j=a[i];j<b[i];j++){
14             ojbk[j]++;
15         }
16     }
17     for(int i=0;i<n;i++){
18         cin>>c[i]>>d[i];
19         for(int j=c[i];j<d[i];j++){
20             ojbk[j]++;
21         }
22     }
23     int count=0;
24     for(int i=0;i<1000000;i++){
25         if(ojbk[i]>1) count++;
26     }
27     cout<<count;
28     return 0;
29 }
View Code

請各位大佬指點

CCF計算機職業資格認證考試 201809-2 買菜