首页 > 试题广场 >

运动会

[编程题]运动会
  • 热度指数:1545 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

一年一度的快手运动会又要开始了,同学们终于有一天可以离开鼠标键盘显示器,全身心的投入到各种体育项目中。UED设计师小红虽然没有参加体育项目,但她的责任重大,因为她是拉拉队的队长,她需要在每个项目中为参赛的同学们加油助威。

因为运动会的项目众多,很多项目在同一时间会同时进行着。作为拉拉队长,小红需要遵守以下规则:

不能同时给多个体育项目加油助威

给每个体育项目加油的时长必须超过项目时长的一半,每个体育项目只能加油一次

体育项目的开始和结束时间都是整点,如果项目进行到一半想要离开,也只能选择整点离开

不考虑往返于各个体育项目比赛场地中花费的时间

请帮小红设计一个算法,在已知所有体育项目日程的前提下,计算是否能在每个体育项目中为参赛的同学们加油。


说明:

如果体育项目时长为2,超过时长的一半为2;

如果体育项目时长为3,超过时长的一半为2;

如果体育项目时长为4,超过时长的一半为3;


输入描述:
输入包括1+N行 第一行输入一个整数N, 1 <= N <= 10,表示今天要参加多少个讨论会 后续N行,每行输入开始和结束时间,均为整数,用空格分隔,0 <= startTime < endTime <= 24


输出描述:
输出包括一行 如果小红能够参加全部讨论会,返回1 如果小红不能够参加全部讨论会,返回-1
示例1

输入

3
3 10
1 5
4 6

输出

1

#记录[开始时间,最迟开始时间,持续时间]
(5333)#按最迟开始时间排序,最迟开始时间早的一定在晚的前面开始进行
#设置一个时间点
(5334)#(当前时间+加油时间)>下一个最迟开始时间
list = []
N = int(input())
for i in range(N):
    start,end=(int(i) for i in input().split(" "))
    list.append([start,end-(end-start)//2-1,(end-start)//2+1])
list.sort(key=lambda x:x[1])
start=list[0][0]
count=0
for i in list:
    if start>i[1]:
        print(-1)
        break
    else:
        start+=i[2]
        count+=1
if count==N:
    print(1)


编辑于 2020-04-18 21:45:30 回复(0)