【题解】自动晾衣机
【题目描述】
有一个环形可以晾衣服的衣架,有若干个夹子组成,它可以晾不同长度的衣服(占用多个夹子),并且每两件衣服中间要有一个空夹子作为空位,下面需要依次晾干几件长度不一的衣服,请你给出某个夹子的使用情况。
【输入格式】
第一行一个数n,表示晾衣架的长度。(n<100000)
接下来有若干条数据,每条数据第一行若干个数(数据保证不会占满n),表示衣服的长度
第二行一个数 i,表示要查询 i 位置的使用情况
【输出格式】
输出第x位置夹子的状态
对于每个数据,输出一个状态占一行,其中使用0表示未使用,1表示有衣服,2表示格子用于隔开衣服。
【样例输入】
50 2 33 2 34 3 25 2 1 50
【样例输出】
2 0
【参考代码一】
#include <iostream>
#include <cstring>
using namespace std;
int f[100005];
int main() {
int n, m, t, now;
cin >> n;
while (cin >> m) {
memset(f, 0, sizeof f), now = 0; // 每次都需要重新初始化
for (int i = 1; i <= m; ++i) {
cin >> t;
for (int j = ++now; j < now + t; ++j)
f[j] = 1; // 衣服占的位置
f[now += t] = 2; // 隔开的位置
}
cin >> m;
cout << f[m] << endl;
}
return 0;
}【参考代码二】
解题思路
环形结构:晾衣架是环形的,因此需要考虑循环遍历。
衣服晾晒规则:
每件衣服占用连续的夹子。
每两件衣服之间必须有一个空夹子作为分隔。
状态标记:
使用数组
state记录每个夹子的状态。遍历每件衣服,标记其占用的夹子为
1,并确保分隔夹子为2。查询输出:
根据查询的位置
i,输出state[i]的值。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n; // 晾衣架的长度
cin >> n;
vector<int> state(n, 0); // 初始化所有夹子状态为0(未使用)
int pos = 0; // 当前晾衣的起始位置
while (true) {
// 读取衣服长度
int len;
if (!(cin >> len)) break; // 如果没有输入,结束循环
// 检查是否超出晾衣架长度
if (pos + len > n) {
pos = 0; // 如果超出,从头开始
}
// 标记衣服占用的夹子为1
for (int i = 0; i < len; ++i) {
state[(pos + i) % n] = 1;
}
// 标记分隔夹子为2
state[(pos + len) % n] = 2;
// 更新起始位置
pos = (pos + len + 1) % n;
}
// 查询夹子状态
int i;
while (cin >> i) {
cout << state[i] << endl;
}
return 0;
}扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。
