9 条题解

  • 24
    @ 2023-6-2 15:23:47
    题目大意
            给出一个入队出队的顺序,求有几个插队了。

    完整思路
            通过题意,可分析得知第i个入队的人,一定第i个出队,不然他就是被插队了。

    模拟一个普通的队列,遇到in的时候,从队尾入队,遇到out的时候,如果和当前的队头不对应,说明这个人之前插队了,把答案ans增加1,把这个人记录为已经出队。同时需要注意,每次要先检查队列头部,把已经被记录为出队的元素出队。



    题解
    
    #include <bits/stdc++.h>
    using namespace std;
    queue<string> q;
    string c, s;
    int n, ans, cnt;
    string a[1005]; //数组a和cnt记录已经出队的人
    bool check(string x)
    {
        for (int i = 1; i <= cnt; i++)
            if (a[i] == x)
                return true;
        return false;
    }
    int main()
    {
        cin >> n;
        for (int i = 1; i <= n; i++)
        {
            cin >> c >> s;
            if (c == "in")
            {
                q.push(s);
            }
            else
            {
                while (!q.empty() && check(q.front()))
                {
                    q.pop();
                }
                if (s == q.front())
                {
                    q.pop();
                }
                else
                {
                    a[++cnt] = s;
                    ans++;
                }
            }
        }
        cout << n / 2 - ans;
        return 0;
    }
    
    
    • 15
      @ 2023-11-2 22:59:15

      AC代码,放心用~😄

      #include <iostream>
      #include <cstring>
      #include <cmath>
      #include <queue>
      using namespace std;
      queue<string> que;
      int main()
      {
          int n,num=0;
          string opt,name,x;
          cin >> n;
          for(int i=1;i<=n;i++)
          {
              cin >> opt >> name;
              if(opt=="in")
              {
                  que.push(name);
              }
              else if(opt=="out")
              {
                  if(que.front()==name)
                  {
                      num++;
                      que.pop();
                  }
                  else
                  {
                  	int pos=que.size();
                      while(pos!=0)
                      {
                          string cd=que.front();
                          //cout << cd << endl;
                          if(que.front()==name)
                          {
                          	que.pop();
      					}
      					else
      					{
      						que.pop();
                          	que.push(cd);
      					}
      					pos--;
                      }
                  }
              }
          }
          cout << num;
          return 0;
      }
      
      • 5
        @ 2023-7-21 15:15:53

        这道题目要求我们统计不插队的人数,我们可以通过记录进队和出队的同学的信息,然后根据他们的顺序,判断是否存在插队的情况。

        具体来说,我们可以用两个数组inout来记录进队和出队的同学的信息,用incntoutcnt记录它们的数量,这样,in数组存储的就是没有插队时的排队顺序。然后,我们从in数组的第一个元素开始遍历,对于每个进队的同学,我们在out数组中查找他的位置,如果他的位置在之前的没有插队的同学的位置之后,那么说明这位同学是按照顺序排队的,我们将计数器cnt加一,并更新lastpos,即上一次找到的没有插队的人在out数组中的位置。最后输出cnt即可。

        #include <iostream>
        #include <algorithm>
        using namespace std;
        int main()
        {
            int n,cnt=0,incnt=0,outcnt=0;
            string x,in[505],out[505];
            cin>>n;
            for(int i=1;i<=n;i++)
            {
                cin>>x;
                if(x=="in")
                {
                    cin>>x;
                    in[++incnt]=x;
                }
                else if(x=="out")
                {
                    cin>>x;
                    out[++outcnt]=x;
                }
            }
            int lastpos=0;
            for(int i=1;i<=incnt;i++)
            {
                int find_result=find(&out[1],&out[outcnt+1],in[i])-&out[0];
                if(find_result>lastpos)
                {
                    cnt++;
                    lastpos=find_result;
                }
            }
            cout<<cnt;
        }
        
        • 1
          @ 2023-10-21 11:47:25

          AC代码

          #include <bits/stdc++.h>
          using namespace std;
          queue<string> q;
          int n,ans,cnt;
          string c,s,a[1005];
          bool check(string x)
          {
              for (int i = 1; i <= cnt; i++)
              if (a[i] == x)return true;
              return false;
          }
          int main()
          {
              cin>>n;
              for (int i = 1; i <= n; i++)
              {
                  cin>>c>>s;
                  if (c=="in")q.push(s);
                  else{
                      while (!q.empty() && check(q.front()))q.pop();
                      if (s==q.front())q.pop();
                      else{
                      a[++cnt]=s;
                      ans++;
                      }
                  }
              }
              cout<<n/2-ans;
              return 0;
          }//by hetao1285761
          
          • -2
            @ 2024-4-6 1:11:08

            这道题的第4个测试样本有误,无法判定正确的程序。 我的程序测试结果是9对1错,一直报4号样本错误,但是找不到错误原因,怀疑有同名的人重复入队或者出队了。于是我写了一个测试代码,对入队测试结果显示“#4 Wrong Answer 0读取到 1619Y,应为 3。”,说明第16和第19入队的两个人都是‘Y’,而出队测试结果没有重复的。这与题目明确说明的前提条件:“保证已经出队的同学不会再入队”,“保证每个人的名字各不相同”相矛盾,请务必修正。测试代码如下:

            #include <queue>
            #include <vector>
            #include <string>
            #include <iostream>
            using namespace std;
            vector<string> inq;
            vector<string> outq;
            int main()
            {
            	int n = 0, ans = 0;
            	string s, name;	
            	cin >> n;
            	for (int i = 1 ; i <= n ; i++)
            	{
            		cin >> s >> name;
            		if (s == "in")
            			inq.push_back(name);
            		else
            			outq.push_back(name);
            	}    
                for(int i=0;i<n/2 -2;i++)
                {
                    for(int j=i+1;j<n/2-1;j++)
                    {
                        if(inq[i] == inq[j])
                        {
                            cout << i << j << inq[i] << endl;
                            return 0;
                        }
                    }
                }
                cout << "end\n";
                return 0;
            }
            

            网站老师已经修改,谢谢。

            • -2
              @ 2023-8-16 18:19:39
              #include <iostream>
              #include <algorithm>
              using namespace std;
              int main()
              {
                  int n,cnt=0,incnt=0,outcnt=0;
                  string x,in[505],out[505];
                  cin>>n;
                  for(int i=1;i<=n;i++)
                  {
                      cin>>x;
                      if(x=="in")
                      {
                          cin>>x;
                          in[++incnt]=x;
                      }
                      else if(x=="out")
                      {
                          cin>>x;
                          out[++outcnt]=x;
                      }
                  }
                  int lastpos=0;
                  for(int i=1;i<=incnt;i++)
                  {
                      int find_result=find(&out[1],&out[outcnt+1],in[i])-&out[0];
                      if(find_result>lastpos)
                      {
                          cnt++;
                          lastpos=find_result;
                      }
                  }
                  cout<<cnt;
              }
              
              • -2
                @ 2023-8-6 20:34:05
                #include <iostream>
                #include <algorithm>
                using namespace std;
                int main()
                {
                    int n,cnt=0,incnt=0,outcnt=0;
                    string x,in[505],out[505];
                    cin>>n;
                    for(int i=1;i<=n;i++)
                    {
                        cin>>x;
                        if(x=="in")
                        {
                            cin>>x;
                            in[++incnt]=x;
                        }
                        else if(x=="out")
                        {
                            cin>>x;
                            out[++outcnt]=x;
                        }
                    }
                    int lastpos=0;
                    for(int i=1;i<=incnt;i++)
                    {
                        int find_result=find(&out[1],&out[outcnt+1],in[i])-&out[0];
                        if(find_result>lastpos)
                        {
                            cnt++;
                            lastpos=find_result;
                        }
                    }
                    cout<<cnt;
                }
                
                
                • -2
                  @ 2023-6-2 18:27:12

                  首先看看题目

                  题目描述

                  又到饭点了,小核桃靠着惯性走到了食堂,但长长的队伍顿时让他失去了食欲。突然,他注意到某个窗口前的队伍里明显存在插队的现象,于是他默默记录下了同学们进队和出队的变化。

                  对于进队,小核桃只知道队伍里多了一个人,并不知道新来的人是老老实实站到了队尾还是插到了队伍里的某个位置;对于出队,小核桃能确定是队伍里站在最前面的人出队了。

                  初始时队伍为空,给出n条队伍进出的信息,保证已经出队的同学不会再入队,并且最终队伍也为空,现在小核桃想知道有多少不插队的好同学。

                  输入格式

                  第一行是一个整数n(1≤ n ≤ 1000),表示这个队伍进出的信息数。

                  接下来n行,每行是两个字符串Opt Name,其中Opt为"in"代表进队,"out"代表出队,Name为进队或出队的人的名字, 所有信息按照时间顺序给出,名字由英文字母和阿拉伯数字组成,长度不超过10,保证每个人的名字各不相同。

                  输出格式

                  输出一行,包含一个整数,表示不插队的人数。


                  #include <bits/stdc++.h>

                  using namespace std;

                  queue<string> q;

                  string c, s;

                  int n, ans, cnt;

                  string a[1005]; //数组a和cnt记录已经出队的人

                  bool check(string x)

                  {

                  for (int i = 1; i <= cnt; i++)
                  
                      if (a[i] == x)
                  
                          return true;
                  
                  return false;
                  

                  }

                  int main()

                  {

                  cin >> n;

                  for (int i = 1; i <= n; i++)//队伍进出的信息数

                  {

                  cin >> c >> s;//输入
                  
                  if (c == "in")//如果c字符等于in,说明入队
                  
                  {
                  
                      q.push(s);
                  
                  }
                  
                  else
                  
                  {
                  
                      while (!q.empty() && check(q.front()))//当前队列不为空 同时检查队头元素,如果和当前的队头不对应说明插队了,相同直接出队
                  
                      {
                  
                          q.pop();//队头出队
                  
                      }
                  
                      if (s == q.front())//判断当前的名字是否等于队头的名字
                  
                      {
                  
                          q.pop();//相等,队头出队
                  
                      }
                  
                      else
                  
                      {
                  
                          a[++cnt] = s;//记录当前的名字
                  
                          ans++;//插队人数ans增加1
                  
                      }
                  
                  }
                  

                  }

                  cout << n / 2 - ans;//不插队的人数

                  return 0;

                  通过题意,可分析得知第i个入队的人,一定第i个出队,不然他就是被插队了。

                  模拟一个普通的队列,遇到in的时候,从队尾入队,遇到out的时候,如果和当前的队头不对应,说明这个人之前插队了,把答案ans增加1,把这个人记录为已经出队。同时需要注意,每次要先检查队列头部,把已经被记录为出队的元素出队。

                  完整代码 //摘抄留名 ``

                  #include
                  using namespace std;
                  
                  queue<string> q;
                  
                  string c, s;
                  
                  int n, ans, cnt;
                  
                  string a[1005]; //数组a和cnt记录已经出队的人
                  
                  bool check(string x)
                  
                  {
                  

                  for (int i = 1; i <= cnt; i++)

                  if (a[i] == x)
                  
                      return true;
                  

                  return false;

                  }
                  
                  int main()
                  
                  {
                  

                  cin >> n;

                  for (int i = 1; i <= n; i++)//队伍进出的信息数

                  {

                  cin >> c >> s;//输入
                  
                  if (c == "in")//如果c字符等于in,说明入队
                  
                  {
                  
                      q.push(s);
                  
                  }
                  
                  else
                  
                  {
                  
                      while (!q.empty() && check(q.front()))//当前队列不为空 同时检查队头元素,如果和当前的队头不对应说明插队了,相同直接出队
                  
                      {
                  
                          q.pop();//队头出队
                  
                      }
                  
                      if (s == q.front())//判断当前的名字是否等于队头的名字
                  
                      {
                  
                          q.pop();//相等,队头出队
                  
                      }
                  
                      else
                  
                      {
                  
                          a[++cnt] = s;//记录当前的名字
                  
                          ans++;//插队人数ans增加1
                  
                      }
                  
                  }
                  

                  }

                  cout << n / 2 - ans;//不插队的人数

                  return 0;

                  }

                  • @ 2023-6-2 20:39:38

                    你的题解好乱,建议删除,不会有人摘抄的

                  • @ 2023-6-2 21:17:45

                    可能是防止有人直接复制粘贴吧

                • -3
                  @ 2023-10-22 10:34:57

                  这道题目要求我们统计不插队的人数,我们可以通过记录进队和出队的同学的信息,然后根据他们的顺序,判断是否存在插队的情况。

                  具体来说,我们可以用两个数组inout来记录进队和出队的同学的信息,用incntoutcnt记录它们的数量,这样,in数组存储的就是没有插队时的排队顺序。然后,我们从in数组的第一个元素开始遍历,对于每个进队的同学,我们在out数组中查找他的位置,如果他的位置在之前的没有插队的同学的位置之后,那么说明这位同学是按照顺序排队的,我们将计数器cnt加一,并更新lastpos,即上一次找到的没有插队的人在out数组中的位置。最后输出cnt即可。


                  #include <iostream>
                  #include <algorithm>
                  using namespace std;
                  int main()
                  {
                      int n,cnt=0,incnt=0,outcnt=0;
                      string x,in[505],out[505];
                      cin>>n;
                      for(int i=1;i<=n;i++)
                      {
                          cin>>x;
                          if(x=="in")
                          {
                              cin>>x;
                              in[++incnt]=x;
                          }
                          else if(x=="out")
                          {
                              cin>>x;
                              out[++outcnt]=x;
                          }
                      }
                      int lastpos=0;
                      for(int i=1;i<=incnt;i++)
                      {
                          int find_result=find(&out[1],&out[outcnt+1],in[i])-&out[0];
                          if(find_result>lastpos)
                          {
                              cnt++;
                              lastpos=find_result;
                          }
                      }
                      cout<<cnt;
                  }
                  

                  hetao5487227 2023.10.22

                  • 1

                  信息

                  ID
                  127
                  时间
                  1000ms
                  内存
                  256MiB
                  难度
                  3
                  标签
                  递交数
                  1280
                  已通过
                  640
                  上传者