我刚开始写的代码是这样的,只过了1个样例:
#include<bits/stdc++.h>
using namespace std;
int n;
int mp[100];
int main()
{
cin >> n;
string s; cin >> s;
int j = 0;
int i = 0;
int cnt = 0;
for (int k = 0; k < s.size(); k++)
{
int flag = 0;
if (s[k] == '1'&&!mp['1']) //第一次有人进场
{
j++;
flag = 1;
i++;
mp['1']++;
}
else if (s[k] == '1') //如果有人进来了就要挪动位置
{
j++;
flag = 1;
}
//每一秒都要挪动 前提是要有人,没有人的话挪动也没有意义
if(mp['1']&&flag==0)
j++;
if (j > n) //一行坐满了换行
{
i++;
j = 0;
}
cout <<i<< " ";
}
return 0;
}
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
string res;
int n;
int main()
{
cin >> n;
vector<PII>v;
string s; cin >> s;
for (char i : s)
{
//处理新进入的客人前先让其他客人腾位置更新信息
for (auto& j : v)
{
j.y++;
if (j.y == n) //一行坐满了
{
j.x++; //换到下一行的第一列
j.y = 0;
}
}
//腾完位置之后再处理新入场的客人
if(i=='1')v.push_back({0,0}); //新来的客人坐第一个位置
int cnt=0;
//从后往前遍历每一行,目的是为了快速判断最多坐到哪行
for(int I=n-1;I>=0;I--)
{
for(auto &it:v)
{
if(it.first==I) //如果当前行已经有人了,那么就统计一下当前行,break掉
{
cnt++;
break;
}
else if(it.first<I) break;//如果v里面最大行小于I行,那么I行之后的都不可能有人的
}
}
res+=to_string(cnt)+" ";
}
cout<<res<<endl;
return 0;
}