CCF CSP 买菜 Java python csp201809_2 100分

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!大功告成了,如果你还有其他的方法或疑问,欢迎在评论区留言交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值