CCF計算機職業資格認證考試 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,表示時間段的數量。
  接下來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

 

請各位大佬指點

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM