题目大意
就是让你找到一个被区间覆盖的 最大的值
这可以用简单的贪心来解决 代码如下
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<stdio.h>
using namespace std;
struct Nod{
int s,e;
};
Nod a[101];
int cmp(Nod a,Nod b)
{
return a.s < b.s;
}
int main()
{
int n,p,q,i,j,ax,b;
char s[30];
while(~scanf("%d",&n))
{
int cnt = -6000001;
scanf("%d%d",&p,&q);
for(i = 0;i < n;i++)
{
scanf("%d%d",&ax,&b);
a[i].s = ax;
a[i].e = b;
gets(s);
}
sort(a,a+n+1,cmp);
int m = a[0].e;
for(i = 1;i < n;i++)
{
if(a[i].s - 1 > a[i-1].e)
{
cnt = a[i].s-1;
}
m = m < a[i].e ? a[i].e:m;
}
if(m < q)
cout<<q<<endl;
else if(cnt != -6000001)
cout<<cnt<<endl;
else
cout<<"Badly!"<<endl;
}
return 0;
}
代码大意 先把各个区间按照开始的时间进行排序从小到大
然后遍历 设置一个m 每次m都是当前区间的最右边 其实m到最后判断的就是 所有区间最右边的值 如果该值没有 q大
那么说明q没有被覆盖所以直接输出q即可
cnt是为了检查:
若当前区间的开始 - 1 还大于上一个区间右边最大值 就说明 这两个区间 中间的值肯定有没有被覆盖的 而且这些值的最大值就是 当前区间的值-1
所以更新cnt
这样下来即可得到答案!