CCF-CSP 202009-2 风险人群筛查 C++满分题解

题目:

CCF-CSP 202009-2 风险人群筛查 C++满分题解_第1张图片

CCF-CSP 202009-2 风险人群筛查 C++满分题解_第2张图片

CCF-CSP 202009-2 风险人群筛查 C++满分题解_第3张图片

代码版本1: 

#include 
using namespace std;

bool com(int &a, int &b) {
	return a > b;
}

//n个居民,t个时刻
//>=k逗留
int main() {
	int n, k, t, a, b, c, d;
	cin >> n >> k >> t >> a >> b >> c >> d;
	int jing = 0, dou = 0;
	//左下角是(a,b);右下角是(c,b);左上角是(a,d);右上角是(c,d);
	//横坐标在(a,c)之间,纵坐标在(b,d)之间
	while (n--) { //每个居民
		int count = 0; //记录连续出现的次数
		vector  lian;
		bool jingguo = 0;
		for (int i = 0 ; i < t; i++) {
			int x, y;
			cin >> x >> y;
			if ((x <= c && x >= a) && (y <= d && y >= b)) {
				jingguo = 1;
				count++;
			} else {
				lian.push_back(count);
				count = 0;
			}
		}
		lian.push_back(count);//最后一个也是处于区域内的情况
		if (jingguo == 1) {
			jing++;
			if (!(lian.empty())) {//注意这里!
				sort(lian.begin(), lian.end(), com);
				if (lian[0] >= k) {
					dou++;
				}
			}
		}
	}
	cout << jing << endl << dou;
}

注意考虑lian可能为空的情况,要先判断一下 。

代码版本2: 

#include 
using namespace std;

bool com(int &a, int &b) {
	return a > b;
}

//n个居民,t个时刻
//>=k逗留
int main() {
	int n, k, t, a, b, c, d;
	cin >> n >> k >> t >> a >> b >> c >> d;
	int jing = 0, dou = 0;
	//左下角是(a,b);右下角是(c,b);左上角是(a,d);右上角是(c,d);
	//横坐标在(a,c)之间,纵坐标在(b,d)之间
	while (n--) { //每个居民
		int count = 0; //记录连续出现的次数
		int doutime = 0;
		bool jingguo = 0;
		for (int i = 0 ; i < t; i++) {
			int x, y;
			cin >> x >> y;
			if ((x <= c && x >= a) && (y <= d && y >= b)) {
				jingguo = 1;
				count++;//注意这个位置
				doutime = max(doutime, count);

			} else {
				count = 0;
			}
		}
		if (jingguo == 1) {
			jing++;
			if (doutime >= k) {
				dou++;
			}
		}
	}
	cout << jing << endl << dou;
}

本来是想优化一下的,但是两个版本的代码在速度和占用内存上差不多。

你可能感兴趣的:(算法,c++,数据结构)