【贪心】War

输入:

循环输入,每次输入n,代表有几次输入,(1<=n<=100)
随后的一行p ,q 代表总的战争年代的长度(-6000000 <= p <= q <= 6000000)
随后输入n行 ai,bi,ni, p <= A, B <= q ,ai,bi是这次战争的时间范围,ni是这次战争的名称。

输出:

输出一个数字代表在p和q范围内没有战争的那一年,
如果不仅只有一年,则输出没有战争的最大年份。
如果每年都有战争,则输出“ Badly!”。

ll t,n,m,p,q;

struct node{
	int l,r;
}a[maxn];
string s;
bool cmp(node x,node y){
	if(x.r!=y.r) return x.r<y.r;
	return x.l<y.l;
}
int main(){
	while(~scanf("%lld",&n)){
		ll maxx = -inf;
		cin>>p>>q;
		for(int i=0;i<n;i++){
			cin>>a[i].l>>a[i].r;
			getline(cin,s);
		}
		sort(a,a+n,cmp);
		if(a[0].l>p) maxx=a[0].l-1;
		for(int i=1;i<n;i++){
			if(a[i].l-1 <= a[i-1].r){
				a[i].l=a[i-1].r;
				if(a[i-1].r>a[i].r) a[i].r=a[i-1].r;
			}else maxx=a[i].l-1;
		}
		if(a[n-1].r<q) maxx=q;
		if(maxx == -inf) cout<<"Badly!"<<endl;
		else cout<<maxx<<endl;
	}
	return 0;
}

首先这个战争的名称其实没什么用,只要读进来就好了。
按照cmp排序,
如果两个时间段结束时间不同,就按照结束时间早的排在前面,
如果两个时间段结束时间相同,就按照开始时间早的排在前面,
排序后,如果第一个时间段开始的时间比p迟,那就先让最大年份=a[0].l-1;
然后for循环,如果这次的开始年份不早于上次的结束年份,那么这次的左边界=上次的右边界,
甚至如果上次的结束年份比这次的结束时间还要迟,那就然这次的右边界也等于上次的右边界。
否则,如果这次的左边界大于上次的右边界,那最大年份就等于这次的左边界-1;

最后如果最后一个时间段的右边界还是小于q的话,最大年份就等于q;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值