CCF CSP 买菜 Java python csp201809_2 100分
问题描述
小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 < di+1 ,对于所有的i(1 ≤ i ≤ n)有,1 ≤ ai, bi, ci, di≤ 1000000。
问题分析
对于两个人的时间关系分析可知一共有6种情况,我已经在下图中画出。
Java代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class csp201809_2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int number = input.nextInt();
List<Edge> list1 = new ArrayList<>(number);
List<Edge> list2 = new ArrayList<>(number);
Edge temp = null;
for(int i = 0;i < number;i++) {
int begin = input.nextInt();
int end = input.nextInt();
temp = new Edge(begin,end);
list1.add(temp);
}
for(int i = 0;i < number;i++) {
int begin = input.nextInt();
int end = input.nextInt();
temp = new Edge(begin,end);
list2.add(temp);
}
int result = 0;
int firstBegin = 0;
int firstEnd = 0;
int secondBegin = 0;
int secondEnd = 0;
for(int i = 0,j =0;i < list1.size()&& j < list2.size();) {
firstBegin = list1.get(i).begin;
firstEnd = list1.get(i).end;
secondBegin = list2.get(j).begin;
secondEnd = list2.get(j).end;
if(firstBegin >= secondEnd) {
j++;
continue;
}
if(secondBegin >= firstEnd) {
i++;
continue;
}
if(firstBegin > secondBegin) {
if(firstEnd > secondEnd) {
result += (secondEnd - firstBegin);
j++;
}
else {
result += (firstEnd - firstBegin);
i++;
}
}
else {
if(secondEnd < firstEnd) {
result += (secondEnd - secondBegin);
j++;
}
else {
result += (firstEnd - secondBegin);
i++;
}
}
}
System.out.println(result);
}
}
class Edge{
int begin;
int end;
public Edge() {
}
public Edge(int begin, int end) {
this.begin = begin;
this.end = end;
}
}
python3代码如下:
class Edge(object):
def __init__(self, begin ,to):
self.begin = begin
self.to = to
def getBegin(self):
return self.begin
def getTo(self):
return self.to
if __name__=="__main__":
number = (int)(input())
list1 = []
list2 = []
for i in range(number):
temp = input().split(" ")
edge = Edge((int)(temp[0]),(int)(temp[1]))
list1.append(edge)
for i in range(number):
temp = input().split(" ")
edge = Edge((int)(temp[0]),(int)(temp[1]))
list2.append(edge)
result = 0
i = 0
j = 0
firstBegin = 0
firstEnd = 0
secondBegin = 0
secondEnd = 0
while i != number and j != number :
firstBegin = list1[i].getBegin()
firstEnd = list1[i].getTo()
secondBegin = list2[j].getBegin()
secondEnd = list2[j].getTo()
if firstBegin >= secondEnd :
j = j + 1
continue
if secondBegin >= firstEnd :
i = i + 1
continue
if secondBegin < firstBegin:
if secondEnd < firstEnd:
result += (secondEnd - firstBegin)
j += 1
else:
result += (firstEnd - firstBegin)
i += 1
else:
if secondEnd < firstEnd:
result += (secondEnd - secondBegin)
j += 1
else:
result += (firstEnd - secondBegin)
i += 1
print(result)
ok!大功告成了,如果你还有其他的方法或疑问,欢迎在评论区留言交流!