【小黑子szy】行程码(模拟)

本文描述了一个算法,根据给定的当前日期、小爱的行程记录以及中高风险城市的列表,生成包含小爱在过去1414天内的行程风险等级(绿、黄、红)和最近访问的城市的行程码。
摘要由CSDN通过智能技术生成
题目描述

给定当前日期,以及小爱最近的行程,给定当前所有中高风险地区城市名字及风险等级,请生成小爱的行程码。具体说明如下:

  • 城市名称是由小写英文字母组成的字符串,不含大写字母、数字或其他字符;
  • 一部分城市为中高风险城市。风险等级分为高风险(以 H 表示)或中风险(以 M 表示);
  • 输入数据只给出中高风险城市,其余城市均默认为低风险;
  • 行程中的时间由月份与日期组成,中间以 - 号链接,如 02-29 表示2月29日,所有时间均在2020年。输入数据保证不会出现不合理的日期,月份和日期均为两位数字,若不足两位,首位以 0 补全。
  • 行程是由时间和城市名称组成的,表示在给定的时间,小爱在给定的城市活动。

生成行程码的要求如下:

  • 行程码只关心小爱在当前日期前 1414 天内的行程。 1414 天内的含义是指若两个日期之差小于或等于 1414 天。
  • 行程码按绿、黄、红三色区分风险等级
    • 若 1414 天内有高风险地区行程,显示红码(以Red表示);
    • 否则,若 1414 天内有中风险地区行程,显示黄码(以Yellow表示);
    • 否则,说明小爱没有中高风险地区行程,显示绿码(以Green表示)。
  • 行程码还应列举出当前日期前 1414 天内访问过的所有城市:
    • 最近访问的城市应优先输出;
    • 若需要输出多个城市,以 , 隔开城市名;
    • 若城市为中高风险,则城市名后应添加 (M) 或 (H) 标识。
    • 若访问同一个城市多次,则只输出与当前日期最近的一次。
输入

第一行:单个正整数 �n,表示中有 �n 个城市为中高风险城市。
接下来 �n 行:每行有一个城市名称及一个字符,由空格隔开,表示该城市的风险等级,保证不会有两行的城市名称相同;
接下来一行:单个正整数 �m,表示行程数量。
接下来 �m 行:每行表示一条行程,由月份、日期及城市名称组成。
最后一行:一个日期,表示当前日期

输出

第一行:一个字符串,表示行程码的颜色(为 GreenYellowRed中的一种);
第二行:一个字符串,表示小爱最近的行程记录。

样例输入
3
berlin M
london M
newyork H
6
11-30 guangzhou
12-03 ningbo
12-04 hangzhou
12-05 shanghai
12-08 london
12-11 shanghai
12-17
样例输出
Yellow
shanghai,london(M),hangzhou,ningbo
#include<bits/stdc++.h>
using namespace std;
struct walk{
	int month,day,last;
	string city;
}a[1001],now;
struct h{
	int rank;
	string city;
	char risk;
}l[101];
string vis[101];
int n,m,id,month[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>l[i].city>>l[i].risk;
		if(l[i].risk=='M') l[i].rank=1;
		if(l[i].risk=='H') l[i].rank=2;
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		scanf("%d-%d",&a[i].month,&a[i].day);
		cin>>a[i].city;
	}
	scanf("%d-%d",&now.month,&now.day);
	for(int i=1;i<=m;i++){
		if(a[i].month==now.month){
			a[i].last=now.day-a[i].day;
		}else if(a[i].month==now.month-1){
			a[i].last=now.day+month[a[i].month]-a[i].day;
		}else{
			a[i].last=500;
		}
	}
	int color=0;
	for(int i=m;i>=1;i--){
		if(a[i].last<=14){
			for(int j=1;j<=n;j++){
				if(a[i].city==l[j].city&&l[j].rank>color){
					color=l[j].rank;
				}
			}
		}
	}
	if(color==0) cout<<"Green"<<endl;
	if(color==1) cout<<"Yellow"<<endl;
	if(color==2) cout<<"Red"<<endl;
	for(int i=m;i>=1;i--){
		int flag=0;
		if(a[i].last<=14){
			for(int j=1;j<=id;j++){
				if(a[i].city==vis[j]) flag=1;
			}
			if(flag) continue;
			else vis[++id]=a[i].city;
			if(i==m) cout<<a[i].city;
			if(i<m) cout<<","<<a[i].city;
			for(int j=1;j<=n;j++){
				if(a[i].city==l[j].city){
					cout<<"("<<l[j].risk<<")";
				}
			}
		}
	}
	return 0;
}
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值