广联达8-31 c++开发卷子

第一题:粒子实验,带有标号的粒子按顺序发射,无意外也应该按顺序到达,现在给你两个数组,分别表示各个粒子发射顺序和到达顺序,判断有几个粒子出了意外。
做法,哈希+寻找逆序元素的个数;通过100%
#include<bits/stdc++.h>
using namespace std;


int main()
{
  int n;
  cin>>n;
  vector<int> v1(n),v2(n);
  unordered_map<int,int> mm;
  for(int i=0;i<n;i++)
  {
    cin>>v1[i];
    mm[v1[i]]=i;
  }
  for(int i=0;i<n;i++)
    cin>>v2[i];
  vector<int> v(n);
  for(int i=0;i<n;i++)
  {
    int t=mm[v2[i]];
    v[i]=t;
  }
  int ans=0;
  for(int i=0;i<n;i++)
  {
    for(int j=i+1;j<n;j++)
    {
      if(v[j]<v[i])
      {
        ans++;
        break;
      }
    }
  }
  cout<<ans<<endl;
  return 0;
}
第二题:最多的人,有n个位置,现在有m个规则,要求在某个区间内最多坐多少人。求一共最多能坐多少人?
做法1:左边界排序,暴力搜索当前位置是否能坐人,包含当前位置的所有区间都能坐人,则坐下,这些区间的可坐人数减一,否则,不能做人;
            当当前位置不在起始区间的时候,则起始区间下标+1;通过36,寄
#include<bits/stdc++.h>
using namespace std;

int main()
{
  int n,m;
  cin>>n>>m;
  vector<vector<int>> vv(m);
  for(int i=0;i<m;i++)
  {
    int a,b,c;
    cin>>a>>b>>c;
    vv[i]={a,b,c};
  }
  sort(vv.begin(),vv.end(),[](vector<int>&a,vector<int>&b){
    if(a[0]==b[0]) return a[1]<b[1];
    return a[0]<b[0];
  });
  vector<int> pansenger(n+1,1);
  pansenger[0]=0;
  int ans=0;
  int x=0;
  for(int i=1;i<=n&&x<m;i++)
  {
    if(i<vv[x][0]||i>vv[x][1])
    {
      x++;
      //continue;不应该continue,否则只有36
    }
    bool isok=true;
    vector<int> res={};
    for(int j=x;j<m;j++)
    {
      int a=vv[j][0],b=vv[j][1],&c=vv[j][2];
      if(i>=a&&i<=b)
      {
        if(c<=0) 
        {
          isok=false;
          break;
        }
        res.push_back(j);
      }
      else
      {
        break;
      }
    }
    
    if(isok)
    {
      for(auto p:res) vv[p][2]--;
    }
    else pansenger[i]=0;
    
  }
  ans=accumulate(pansenger.begin(),pansenger.end(),0);
  cout<<ans<<endl;
  return 0;
}
做法2:左边界排序,暴力搜索所有区间,但是不在一步步的移动当前位置,而是跳跃式的移动。通过45;后面懒得修改交卷了;
#include<bits/stdc++.h>
using namespace std;


int main()
{
  int n,m;
  cin>>n>>m;
  vector<vector<int>> vv(m);
  for(int i=0;i<m;i++)
  {
    int a,b,c;
    cin>>a>>b>>c;
    vv[i]={a,b,c};
  }
  sort(vv.begin(),vv.end());
  vector<int> pansenger(n+1,0);
  
  auto lowbit=[=](int &x)
  {
    return x&(-x);
  };
  auto get=[=](int x) mutable
  {
    int res=0;
    while(x>=1)
    {
      res+=pansenger[x];
      x-=lowbit(x);
    }
    return res;
  };
  auto add=[=](int x,int y) mutable
  {
    int res=0;
    while(x<=n)
    {
      pansenger[x]+=y;
      x+=lowbit(y);
    }
  };
  auto updata=[=](int a,int b) mutable
  {
    for(int i=a;i<b;i++)
    {
      add(i,1);
    }
  };
  
  int cur=1;
  int ans=0;
  for(auto pp:vv)
  {
    int &a=pp[0];
    int &b=pp[1];
    int &c=pp[2];
    if(b<cur) continue;
    if(a>cur) 
    {
      ans+=a-cur;
      cur=a;
      updata(cur,a);
    }
    c-=get(cur)-get(a-1);
    a=cur;
    if(b-a+1>=c)
    {
      ans+=c;
      updata(a,a+c);
    }
    else
    {
      ans+=b-a+1;
      updata(a,b+1);
    }
    cur=b+1;
  }
  cout<<ans<<endl;
  return 0;
}

#笔试##广联达##秋招##校招#
全部评论
第二题排序了过45,不排序过54
点赞 回复 分享
发布于 2022-08-31 22:43 陕西
扫描线
点赞 回复 分享
发布于 2022-09-02 19:37 安徽
同学同花顺尝试一下吗,面试简单不造火箭,可保姆式全程跟进度,我帖子有内推
点赞 回复 分享
发布于 2022-09-24 06:17 浙江

相关推荐

8 15 评论
分享
牛客网
牛客企业服务