列表

详情


NC218841. 苏幕遮--寻姻缘

描述

游凡尘,弄姻缘。悲欢离合,红线足间牵。哪能世事皆齐全。情愫万分,只手拨心弦。
逢十五,叹月圆。冷瑟萧索,寒衾孤身眠。夜夜诚诵月老篇。渺渺无声,悲喜有谁怜?

楚天看着身边的小伙伴们都脱单了,羡慕不已,但自己却还没遇到心爱之人。于是他跋山涉水,去寻找月老,渴望求得一份美好姻缘。
历经艰难险阻,楚天终于找到了月老,但是月老很忙,因为他掌管着人间所有人的姻缘册,所以他让楚天帮他干活:

个人,每个人的人生轨迹可以看做一条数轴上的线段。要选其中契合度最大的两人,为两人牵线,契合度为两线段重合部分的长度。
为了能尽快让楚天完成任务,你能帮他算出最大的契合度是多少吗,以及是哪两根线段构成的呢?

输入描述

第一行一个整数表示测试组数。
每组数据第一行一个整数表示线段个数。
接下来行每行两个整数表示左端点和右端点。

输出描述

每组数据输出三个整数,最大契合度以及两个线段的下标
线段下标从开始,你的输出应该满足,并且两线段的重合长度为最大契合度。
如果有多种可能,你可以输出任意一种。

示例1

输入:

3
3
3 5
4 5
2 4
3
2 4
2 5
3 4
3
1 2
2 3
3 4

输出:

1 1 2
2 2 1
0 1 3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 388ms, 内存消耗: 20876K, 提交时间: 2021-03-24 23:01:09

#include<bits/stdc++.h>
using namespace std;
struct node
{
	int l,r,id;
}e[100010];
signed main()
{
	int t,n;
	cin>>t;
	while(t--)
	{
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			scanf("%d %d",&e[i].l,&e[i].r);
			e[i].id=i;
		}
		sort(e+1,e+n+1,[](node x,node y)//加编译选项 
		{
			return x.l<y.l;
		});
		int d1=1,d2=2,a,b=-1,lon=0,len;
		for(int i=1;i<=n;i++)
		{
			len=e[i].r-e[i].l;
			if(b>e[i].l)
			{
				len=min(len,b-e[i].l);
				if(len>lon)
				{
					lon=len;
					d1=e[i].id;
					d2=a;
				}
			}
			if(e[i].r>=b)
			{
				b=e[i].r;
				a=e[i].id;
			}
		}
		cout<<lon<<" "<<d1<<" "<<d2<<endl;
	}
	return 0;
 } 

上一题