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

发布时间:2024年01月06日

题目:

代码版本1:?

#include <bits/stdc++.h>
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 <int> 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 <bits/stdc++.h>
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;
}

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

文章来源:https://blog.csdn.net/m0_73772116/article/details/135371271
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。