蓝桥杯国赛大学B组c/c++H题目抓娃娃

原题链接:

https://www.luogu.com.cn/problem/P9426

题目

输入样例的最后一行是错误的,按题目要求应该是2 4,才能输出这个结果

思路:

1.题目要求有一个非常重要的关键点:至少有一半长度包含在这个框内,才算被框住

(ps:最近在准备国赛,我看了好多这个题的解答,发现有的作者大大好像没有考虑到,我这个题解也没见有人写,所以写了这个文章)

我的思路就是将这个一半的长度,转换为该线段端点的个数有一半以上在这个框的范围里面。我画了张图:

手写,可能写的有点丑,没找到尺子,将就看吧

2.然后再用一个vector(也可以直接用二维数组),储存每一个数轴点上存在的线段

3.最后,输入区间范围,看区间内每个线段端点的个数有没有满足至少包含一半以上,满足sum加1,最后输出

代码:
 

#include<bits/stdc++.h>
using namespace std;

const int MAX1=10e6+7;
const int MAX2=10e5+7;
vector<int> SZ[MAX1];
int n,m,JL[MAX2],Saccout[MAX2];

int main()
{
	int n,m,sum;
	cin>>n>>m;
	
	for(int i=1;i<=n;i++){
		int a,b;
		cin>>a>>b;
		for(int j=a;j<=n;j++){
			SZ[j].push_back(i);
		}
		Saccout[i]=(b-a+1)/2.0+0.5;//最少包含的端点个数 
	}
	
	while(m--){
		sum=0;
		memset(JL,0,sizeof(JL+MAX2));
		int l,r;
		cin>>l>>r;
		for(int i=l;i<=r;i++){
			for(int j=0;j<SZ[i].size();j++){
				int now=SZ[i][j];
				JL[now]++;
				if(JL[now]==Saccout[now])
					sum++;
			}		
		}
		cout<<sum<<endl;
	}
	
	return 0;	
}

总结:

一共用到了vector容器和memset进行初始化两部分知识点

第一次写文章,可能写的不太好,不知道我有没有说明白,如果你看到这里,本人表示非常感谢,谢谢阅读(比心)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值