招募队员问题

#include <bits/stdc++.h>
using namespace std;

int main()
{
  int n;
  cin >> n; // 输入队伍人数(行数)

  vector<int> maxx(5, 0); // 用于记录每个数字(1~5)出现的最大连续段长度

  // 定义二维数组 team,n 行 5 列
  vector<vector<int>> team(n, vector<int>(5));

  // 输入每一行的5个值
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < 5; j++)
    {
      cin >> team[i][j];
    }
  }

  // 遍历每个数字 i,从 1 到 5
  for (int i = 1; i <= 5; i++)
  {
    int l = 0;

    // 用滑动窗口查找最大连续区间
    while (l < n)
    {
      // 找到第一个包含数字 i 的合法起点
      while (l < n)
      {
        bool valid = false;
        for (int j = 0; j < 5; j++)
        {
          if (team[l][j] == i)
          {
            valid = true;
            break;
          }
        }
        if (valid)
          break;
        l++; // 不合法,继续右移
      }

      int r = l;

      // 继续往右扩展,直到某一行不再包含数字 i
      while (r < n)
      {
        bool valid = false;
        for (int j = 0; j < 5; j++)
        {
          if (team[r][j] == i)
          {
            valid = true;
            break;
          }
        }

        if (!valid)
          break;

        r++; // 向右扩展合法区间
      }

      // 更新最大长度
      maxx[i - 1] = max(r - l, maxx[i - 1]);

      l = r; // 从不合法行之后继续找
    }
  }

  // 输出每个数字的最大连续长度
  for (int i = 0; i < 5; i++)
  {
    cout << maxx[i] << " ";
  }

  return 0;
}
#include <bits/stdc++.h>
using namespace std;

//vector<<int><vector<int>> a;

int main()
{
  int n;
  cin >> n;
  
  vector<int> maxx(5,0);

  //vector<<char> vector<char>> a();

  //vector<<char> vector<char>> (n,vector<char> (5,0));

  vector<vector<int>> team(n ,vector<int>(5));



  //team = vector<<int>vector<int>> (n,vector<int> (5,0));

  for(int i=0;i<n;i++)
  {
    for(int j=0;j<5;j++)
    {
      cin >> team[i][j];
    }
    
  }


  for(int i=1;i<=5;i++)
  {
    int l=0;

    while(l<n)
    {

      //找到第一个合法的起点  连续区间的左下标
      while(l<n)
      {

        bool valid =false;

        for(int j=0;j<5;j++)
        {
          if(team[l][j] == i )
          {
            valid = true;
            break;
          }
        }

        if(valid) 
        break;

        l++;

      }

      int r=l;
      
      //向右扩展区间
      while(r<n)
      {

        bool valid =false;

        for(int j=0;j<5;j++)
        {
          if(team[r][j] == i )
          {
            valid = true;
            break;
          }
        }
        
        if(!valid) 
        break;

        r++;

      }

      maxx[i-1] = max(r-l,maxx[i-1]);

      l = r;
    }
  }

  for(int i=0;i<5;i++)
  {
    cout << maxx[i] << " ";
  }

  return 0;
}

模块化

#include <bits/stdc++.h>
using namespace std;

// 判断某队伍中是否包含该成员
bool hasMember(const vector<int>& team, int member) {
    return find(team.begin(), team.end(), member) != team.end();
}
//other
bool hasMember(const vector<int>& team, int member) {
    for (int x : team) {
        if (x == member) {
            return true;
        }
    }
    return false;
}


int main() {
    int n;
    cin >> n;

    vector<vector<int>> team(n, vector<int>(5));
    vector<int> maxx(5, 0); // 记录每个成员的最大连续区间长度

    // 读取队伍信息
    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < 5; ++j) {
            cin >> team[i][j];
        }
    }

    // 枚举每个编号(1 到 5)
    for(int i = 0; i < 5; ++i) {
        int l = 0;
        while(l < n) {
            // 找到第一个包含成员 i+1 的队伍
            while(l < n && !hasMember(team[l], i + 1)) l++;

            int r = l;
            // 扩展右边界
            while(r < n && hasMember(team[r], i + 1)) r++;

            maxx[i] = max(maxx[i], r - l);
            l = r;
        }
    }

    // 输出结果
    for(int i = 0; i < 5; ++i) {
        cout << maxx[i] << " ";
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值