课程冲突(2023.9三级)

题目重现

小A修了n门课程,第i门课程是从第ai天——直上到第bi天。
定义两门课程的冲突程度为:有几天是这两门]课程都要上的。
例如a1=1,b1=3,a2=2,b2=4时,这两门课的冲突程度为2。
现在你需要求的是这n门课中冲突程度最大的两门课的冲突程度。
时间限制: 1000
内存限制: 65536

输入

第一行一个正整数n表示课程数量。接下来 n行,每行两个正整数ai,bi。2≤ n≤1000, 1≤aj≤bj≤1000。

输出

输出一个整数表示最大的冲突程度

样例输入

1 3
2 4
5 5

样例输出

2

解题思路

首先明确题目的意思:检测最大的冲突时间,比如一节课从1-3,第二节课从2-4,这里就会发现重合的时间有2,3这两个,再举一个例子,第一节课1-5,第二节课3-7,就会发现重合时间有3,4,5这三种。在这里就会找到规律:第一节课的结束时间减去下一节课的开始时间加上一个1就会得出两者重复的时间。

开始编写,写头文件,然后定义一个变量,输入并保存一共有几节课。在输入以后定义一个二维数组(其实这道题用结构体或者一维数组等别的方法可以做得更简单,但是这个方法也比较好理解)

#include<iostream>
using namespace std;
int main(){
	int all;
	cin>>all;
	int sum[all+1][2];
    //
}

接着用双重循环输入二维数组中的值(每个课程的开始与结束时间),这里注意:行数有all行,列只有两列。

for(int i=0;i<all;i++){
		for(int j=0;j<2;j++)
			cin>>sum[i][j];
	}

然后再次循环,循环次数为课程的数量,在循环中判断,下一节课的开始时间是否小于上一节课的结束时间,如果判断结果为true,则说明两者冲突,就需要记录重合的时间根据在题目分析中的结论,得到第一节课的结束时间减去下一节课的开始时间加上一个1就会得出两者重复的时间,定义一个flag变量,初始化设置为0,保存上一个表达式计算的结果。在判断外面再做一个判断:flag是否为最大?就需要定义一个max变量,初始化设置为0,与flag判断大小,如果比flag小,就将flag的值保存与max中,使max中的值始终为最大。

int max=0,all,flag=0;
//
for(int i=0;i<all;i++){
	if(sum[i][1]>sum[i+1][0]){
		flag=1+sum[i][1]-sum[i+1][0];
	}
	if(flag>max)
		max=flag;
}

最后输出最大值max。成品如下:

代码展示

#include<iostream>
using namespace std;
int main(){
	int max=0,all,flag=0;
	cin>>all;
	int sum[all+1][2];
	for(int i=0;i<all;i++){
		for(int j=0;j<2;j++)
			cin>>sum[i][j];
	}
	for(int i=0;i<all;i++){
		if(sum[i][1]>sum[i+1][0]){
			flag=1+sum[i][1]-sum[i+1][0];
		}
		if(flag>max)
			max=flag;
	}
	cout<<max<<endl;
	return 0;
}

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值