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

题目:

代码版本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;
}

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

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值