第一题:粒子实验,带有标号的粒子按顺序发射,无意外也应该按顺序到达,现在给你两个数组,分别表示各个粒子发射顺序和到达顺序,判断有几个粒子出了意外。
做法,哈希+寻找逆序元素的个数;通过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;
}
#笔试##广联达##秋招##校招#