【题解】自动晾衣机
【题目描述】
有一个环形可以晾衣服的衣架,有若干个夹子组成,它可以晾不同长度的衣服(占用多个夹子),并且每两件衣服中间要有一个空夹子作为空位,下面需要依次晾干几件长度不一的衣服,请你给出某个夹子的使用情况。
【输入格式】
第一行一个数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; }
扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。