2022年码蹄杯真题剧场Ⅰ 题型:模拟

59 阅读1分钟

码题集OJ-剧场Ⅰ (matiji.net) image.png

我刚开始写的代码是这样的,只过了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;
}

image.png

#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;
}

image.png