2023华为OD机试 (B卷)|200分 计算观看演唱会场次( Java JavaScript C++ Python)

2023华为OD机试 (B卷)|200分 计算观看演唱会场次( Java JavaScript C++ Python)
题目描述

为了庆祝中国共产党成立100周年,某公园将举行多场文艺表演,很多演出都是同时进行,一个人只能同时观看一场演出,且不能迟到早退,由于演出分布在不同的演出场地,所以连续观看的演出最少有15分钟的时间间隔。
小明是一个狂热的文艺迷,想观看尽可能多的演出,现给出演出时间表,请帮小明计算他最多能观看几场演出。

输入描述

第一行为一个数N,表示演出场数,1 <= N<=1000,接下来N行,每行有被空格分割的两个整数,
第一个整数T表示演出的开始时间,第二个整数L表示演出的持续时间
TL的单位为分钟,0 <=T <=1440, 0 <= L <= 100

输出描述

输出最多能观看的演出场数。

用例

输入2
720 120
840 120
输出1
说明

Java

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        List<int[]> timeList = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            int startTime = sc.nextInt();
            int duration = sc.nextInt();
            int endTime = startTime + duration;
            timeList.add(new int[]{startTime, endTime});
        }

        Collections.sort(timeList, new Comparator<int[]>() {
            public int compare(int[] a, int[] b) {
                if (a[1] == b[1]) {
                    return b[0] - a[0];
                } else {
                    return b[1] - a[1];
                }
            }
        });

        int startTime = timeList.get(0)[0];
        int ans = 1;

        for (int[] time : timeList) {
            int curStartTime = time[0];
            int curEndTime = time[1];

            if (startTime - curEndTime > 15) {
                ans++;
                startTime = curStartTime;
            }
        }

        System.out.println(ans);
    }
}

Javascript

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let n;
let timeList = [];

rl.on('line', (input) => {
  if (!n) {
    n = parseInt(input);
  } else {
    const [start, duration] = input.split(' ').map((x) => parseInt(x));
    timeList.push([start, start + duration]);
    if (timeList.length === n) {
      solve();
    }
  }
});

function solve() {
  timeList.sort((a, b) => {
    if (a[1] === b[1]) {
      return b[0] - a[0];
    } else {
      return b[1] - a[1];
    }
  });

  let startTime = timeList[0][0];
  let ans = 1;

  for (let i = 1; i < n; i++) {
    const [curStartTime, curEndTime] = timeList[i];
    if (startTime - curEndTime > 15) {
      ans++;
      startTime = curStartTime;
    }
  }

  console.log(ans);
  rl.close();
}

C++

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;

    vector<vector<int>> timeList(n, vector<int>(2));
    for (int i = 0; i < n; i++) {
        cin >> timeList[i][0]; // 开始时间
        timeList[i][1] = timeList[i][0] + (cin >> timeList[i][1], timeList[i][1]); // 结束时间 = 开始时间 + 持续时间
    }

    sort(timeList.begin(), timeList.end(), [](const vector<int>& a, const vector<int>& b){
        return a[1] == b[1] ? b[0] < a[0] : b[1] < a[1]; // 按照演出结束时间从早到晚排序,如果结束时间相同则按照开始时间从晚到早排序
    });

    int startTime = timeList[0][0]; // 最早开始观看的演出的开始时间
    int ans = 1; // 观看的演出场数

    for (auto& time : timeList) {
        int curStartTime = time[0];
        int curEndTime = time[1];

        if (startTime - curEndTime > 15) { // 如果最早开始观看的演出和当前演出之间的时间差超过15分钟
            ans++; // 可以观看当前演出
            startTime = curStartTime; // 更新最早开始观看的演出的开始时间
        }
    }

    cout << ans << endl; // 输出观看的演出场数
    return 0;
}

python

import sys

n = None
timeList = []

for line in sys.stdin:
    input = line.strip()
    if not n:
        n = int(input)
    else:
        start, duration = map(int, input.split())
        timeList.append([start, start + duration])
        if len(timeList) == n:
            break


timeList.sort(key=lambda x: (-x[1], -x[0]))

startTime = timeList[0][0]
ans = 1

for i in range(1, n):
    curStartTime, curEndTime = timeList[i]
    if startTime - curEndTime > 15:
        ans += 1
        startTime = curStartTime

print(ans)



### 回答1: 很高兴能够参加2023华为OD机试(B)。以下是我的回答: 首先,对于我作为一名技术爱好者和计算机科学专业的学生来说,华为OD机试是我展示自己技能和提升职业能力的绝佳机会。我热爱挑战自己,希望能够通过这次机试来展示我的技术水平和解决问题的能力。 另外,作为一家世界知名的科技公司,华为以其创新能力和领导地位而闻名。参加华为OD机试,我希望能够学习到尖端的技术和最佳的工程实践。通过与华为的工程师们交流和学习,我相信我将能够进一步提升自己,掌握更多的技术和知识。 此外,参加华为OD机试也是为了追求个人职业发展的机会。华为作为一家全球性的科技公司,有广阔的市场和众多的职业发展机会。通过参加华为OD机试,我希望能够获得华为的认可,并有机会加入华为,与卓越的团队一起工作,共同推动公司的发展和创新。 最后,我相信参加华为OD机试将是一次富有挑战性和有意义的经历。我会认真准备,研究和了解华为的相关业务和技术要求。我相信通过自己的努力和准备,我将能够展现出自己的实力和能力,为华为做出贡献。 总而言之,参加2023华为OD机试(B)对我而言是一个重要的机会。我将全力以赴,准备充,希望在机试中有出色的表现。我相信通过这次机试,我将能够展现自己的能力,进一步提升自己,并为华为的发展贡献力量。 ### 回答2: 2023华为OD机试(B)是华为公司在2023年举行的一次线上机试。作为华为公司的OD机试,它将通过互联网的方式进行远程评估,为应聘者提供了参与华为招聘的机会。 华为OD机试(B)相对于其他别可能会有一些特殊设计或者难度更高的问题。应聘者需要准备好面对各种类型的算法和编程问题,以及一些与华为相关的项目经验。 首先,准备方面,应聘者需掌握基本的数据结构和算法,熟悉常见的算法题型,如搜索、排序、动态规划等。此外,对于华为相关的项目和技术,应聘者需要了解并掌握相关的核心知识和实践经验。 其次,在机试过程中,要注意时间的合理安排和控制。机试通常时间较紧,应聘者需要快速理解问题,思考解决方案,并高效地实现代码。同时,要注重代码的可读性和优化,保证代码的正确性和效率。 最后,在OD机试结束后,应聘者还可以了解并掌握自己在机试中的不足之处,进一步提升自己的技术能力。同时,可以多关注和了解一些与华为相关的技术和行业动态,为今后的发展做好准备。 总之,参加2023华为OD机试(B)是一次宝贵的机会,应聘者需要提前做好充的准备,掌握技术知识和项目经验,合理安排时间,在机试中发挥自己的优势,同时也要及时总结经验教训,为未来的发展做好准备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值