试题名称: 买菜
时间限制: 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。
这道题稍微想一下不会难
思路:小H,小W每次的聊天时间就是两个人买菜的时间区间的交集的宽度。总的聊天时间求的就是这些交集宽度的总和。求美两个交集的宽度就行了。每两个交集的宽度我用的是这四个数(就是小H的时间(a,b),小W的时间(c,d)这四个数)的第二大数减第三大数。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int,int> P;
vector<P>H;
vector<P>W;
int main(){
int n;
int s=0;
cin>>n;
int A2(int e,int f,int g,int h);
int A3(int e,int f,int g,int h);
for(int i=0;i<n;i++){
P t;
cin>>t.first>>t.second;
H.push_back(t);
}
for(int i=0;i<n;i++){
P m;
cin>>m.first>>m.second;
W.push_back(m);
}
for(int i=0;i<n;i++)
{
int a=H[i].first,b=H[i].second;
for(int j=0;j<n;j++)
{
int c=W[j].first,d=W[j].second;
if((c>=b)||(d<=a)) continue;
else{
int min=A2(a,b,c,d);
int max=A3(a,b,c,d);
s=s+(max-min);}
}
}
cout<<s<<endl;
return 0;
}
int A2(int e,int f,int g,int h)
{ int z;
if(e<g)z=g;
else z=e;
return z;
}
int A3(int e,int f,int g,int h)
{ int z;
if(f<h)z= f;
else z=h;
return z;
}
这次我第一次用容器没用数组。因为不是学计算机的还不知道容器是什么哈哈 看到有好多人用我也去学了一点, 先小小小试一下