1014 Waiting in Line

该文章介绍了一个涉及多个服务窗口和顾客等待时间的动态模拟问题。通过使用结构体表示窗口,维护每个窗口的队列和服务结束时间,算法逐帧模拟从0到540的时间,处理顾客进出队列和服务结束的情况。特别地,对于17点前开始的服务,即使下班也要完成。代码中包含了详细的注释,以帮助理解复杂的逻辑流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1014 Waiting in Line

题目大意

就是给出的顾客服务时间,动态模拟每个顾客结束的时间,不过需要考虑的因素很多,有很多窗口,还有线外线内等

算法思想

  • 需要一个结构体,用来表示每个窗口,里面会有队伍的序号以及队首结束的时间
  • 动态表示时间从0到540,每当当前时间和队首结束的时间相等时,就弹出队首,此时如果有线外顾客,线外顾客进队
  • 最大的坑点是,如果是17点前接受的服务,哪怕下班了服务也得进行下去
  • 这题还是很复杂的,需要考虑的因素很多,变量也设了一堆,我第一次看懂题目后,脑子都乱死了,直接不想做了,但是仔细分析一下题目后,从容易的地方开始想,慢慢地就完成了这个复杂的题目

代码

写了很多注释,应该能看得懂吧

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef struct window {
	int ftime;//队伍第一个顾客结束服务的时间
	queue<int>people;//排队顾客
}window;
int main()
{
	int n, m, k, q;
	int i, j;
	cin >> n >> m >> k >> q;
	vector<int>cust;//每个顾客的时间
	vector<window>bank(n);//n个窗口的队伍
	for (i = 0; i < k; i++)
	{
		int t;
		cin >> t;
		cust.push_back(t);
	}
	vector<int>qu;//要询问的顾客队列
	for (i = 0; i < q; i++)
	{
		int quer;
		cin >> quer;
		qu.push_back(quer - 1);
	}
	int maxn = k;
	if (k > n * m)
	{
		maxn = n * m;
	}
	vector<int>nt(k);//记录每个顾客结束服务的时间,如果不能服务,就是0
	queue<int>line;//记录线外的顾客
	for (i = m * n; i < k; i++)
	{
		line.push(i);
	}
	j = 0;
	for (i = 0; i < maxn; i++)//线内的顾客进行排序
	{
		j = j % n;
		bank[j].people.push(i);
		if (bank[j].people.size() == 1)
		{
			bank[j].ftime = cust[i];
		}
		j++;
	}
	int nowtime = 0;
	for (nowtime = 0; nowtime <= 540; nowtime++)//动态模拟时间
	{
		for (i = 0; i < n; i++)//有可能不足m*n人
		{
			if (bank[i].people.empty())//如果当前窗口队伍为空,跳过
				continue;
			if (bank[i].ftime > 540)//坑点,一旦开始服务,哪怕下班也得继续下去
				nt[bank[i].people.front()] = bank[i].ftime;
			if (nowtime == bank[i].ftime)//到每队第一个顾客的结束时间
			{
				nt[bank[i].people.front()] = nowtime;//记录该顾客的服务时间
				bank[i].people.pop();
				if (!line.empty())//将线外的进行排队
				{
					bank[i].people.push(line.front());
					line.pop();
				}
				if (bank[i].people.empty())//如果线外没人了,队伍就空了,无法计算下面一行的时间
					continue;
				bank[i].ftime = cust[bank[i].people.front()] + nowtime;
			}
		}
	}
	for (i = 0; i < q; i++)//按询问队列输出
	{
		if (nt[qu[i]] == 0)
		{
			cout << "Sorry" << endl;
		}
		else
		{
			printf("%02d:%02d\n", (nt[qu[i]] + 480) / 60, (nt[qu[i]] + 480) % 60);
		}
	}
}
### 解决方案分析 在处理WSL环境设置过程中遇到的错误 `malformed line while parsing WSL distro list invalid number of fields` 时,可以推测该问题是由于配置文件中的语法错误或字段不匹配引起的。以下是详细的解决方案: #### 错误原因分析 此错误通常发生在WSL尝试解析分发列表(distro list)时发现某些行不符合预期格式。这可能是由以下原因之一引起: 1. **配置文件损坏**:WSL的相关配置文件可能存在语法错误或被意外修改。 2. **发行版安装不完整**:如果Ubuntu-20.04未正确安装,则可能导致其条目在WSL注册表中显示异常[^1]。 3. **WSL版本兼容性问题**:当前使用的WSL版本可能与操作系统存在兼容性问题。 --- #### 配置修复方法 ##### 方法一:重新初始化WSL配置 可以通过删除并重建WSL配置文件来解决问题。执行以下命令以清除现有配置并重置默认状态: ```bash wsl --unregister Ubuntu-20.04 ``` 随后重新启动WSL服务,并通过官方渠道重新安装Ubuntu-20.04: ```powershell wsl --install -d Ubuntu-20.04 ``` ##### 方法二:检查并修正/etc/wsl.conf 有时 `/etc/wsl.conf` 文件中的配置项可能会引发冲突。建议验证是否存在如下内容: ```ini [automount] enabled = true root = / options = "metadata" mountFsTab = false [network] generateResolvConf = true [user] default = root ``` 如果没有上述配置,请将其添加到 `/etc/wsl.conf` 中,并保存更改后重启WSL服务: ```bash sudo nano /etc/wsl.conf wsl --shutdown ``` ##### 方法三:更新WSL及相关组件 确保已安装最新版本的WSL以及相关依赖库。运行以下PowerShell脚本以升级WSL至最新版本: ```powershell wsl --update ``` 同时确认Windows系统是否满足最低要求(需为Windows 10 Build 18917及以上版本)。对于更高版本的操作系统,推荐启用WSL2作为默认引擎: ```powershell wsl --set-default-version 2 ``` ##### 方法四:手动迁移数据目录 如果之前的数据存储路径存在问题,可考虑将根文件系统迁移到新的位置。例如,假设原路径位于: ```plaintext C:\Users\<用户名>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ ``` 则可通过以下方式备份并恢复数据: ```bash tar cvpzf ubuntu-backup.tar.gz --exclude=/backup . mv ~/ubuntu-backup.tar.gz C:\NewLocation\ ``` 之后卸载旧实例并重新导入: ```powershell wsl --unregister Ubuntu-20.04 wsl --import Ubuntu-20.04 C:\NewLocation\ C:\NewLocation\ubuntu-backup.tar.gz --version 2 ``` --- ### 总结 通过对WSL配置文件、发行版安装状态及系统兼容性的综合排查,能够有效定位并解决 `malformed line while parsing WSL distro list invalid number of fields` 的问题。具体操作应视实际场景而定,优先尝试简单的方法逐步排除潜在隐患。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值