青少年编程知识记录 codecoming

【题解】自动晾衣机

【题目描述】

有一个环形可以晾衣服的衣架,有若干个夹子组成,它可以晾不同长度的衣服(占用多个夹子),并且每两件衣服中间要有一个空夹子作为空位,下面需要依次晾干几件长度不一的衣服,请你给出某个夹子的使用情况。

【输入格式】

第一行一个数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;  }










【参考代码二】

解题思路

  1. 环形结构:晾衣架是环形的,因此需要考虑循环遍历。

  2. 衣服晾晒规则

    • 每件衣服占用连续的夹子。

    • 每两件衣服之间必须有一个空夹子作为分隔。

  3. 状态标记

    • 使用数组 state 记录每个夹子的状态。

    • 遍历每件衣服,标记其占用的夹子为 1,并确保分隔夹子为 2

  4. 查询输出

    • 根据查询的位置 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;  }



作者:亿万年的星光 分类:题解目录 浏览: