一、题干
二、思路
若程序员岗位被占完,后续即使有人程序技能非常高也只能去测试岗位,显然先后顺序非常重要。
假设有一个能够担任a类岗位的人不来应聘了,那么对于在他前面来应聘的人不会产生任何影响,但是后来者会多出一个a类岗位,本来因为a类岗位不足而无法选择a类岗位的人将可以去到a类岗位。注意,因为只多了一个位置,所以只有第一个人受影响(无论少哪个人,本来没有工作的第n+m+1个人都会有工作)。
那么我们只需要先处理一遍所有人都来应聘的情况,同时用IN标记第一个因为岗位不足而无法去到高技能点岗位的人即可。
三、题解
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
void solve() {
int n,m;
cin >> n >> m;
LL cnt = n + m + 1;
vector<LL> a(cnt), b(cnt);
vector<int> c(cnt);//保存在岗位信息
for(auto &i : a)cin>>i;
for(auto &i : b)cin>>i;
LL p = 0, t = 0, sum = 0, cp = n, ct = m;
LL IN = -1;
for(int i=0;i<n + m;i++)
{
if(a[i] > b[i] && cp > 0){
cp --;
p += a[i];
c[i] = 1;
}else if(a[i] > b[i]){
ct --;
t += b[i];
c[i] = 2;
if(IN == -1)IN = i;
}else if(a[i] < b[i] && ct > 0){
ct --;
t += b[i];
c[i] = 2;
}else{
cp --;
p += a[i];
c[i] = 1;
if(IN == -1)IN = i;
}
}
sum += p + t;
LL res = sum;
if(IN == -1){//所有人都到了自己擅长的岗位,那么少那个岗位最后的人就去哪个岗位
for(int i=0;i<cnt;i++)
{
res = sum;
if(c[i] == 1){
res -= a[i] - a[n+m];
}else{
res -= b[i] - b[n+m];
}
cout<<res<<' ';
}
}
else{
for(int i=0;i<cnt;i++)
{
res = sum;
if(i < IN){
if(c[i] != c[IN]){
if(c[i] == 1){
res = res - a[i] + a[IN] - b[IN] + b[n+m];
}else{
res = res - b[i] + b[IN] - a[IN] + a[n+m];
}
}else{
if(c[i] == 1){
res -= a[i] - a[n+m];
}else{
res -= b[i] - b[n+m];
}
}
}
else{
if(c[i] == 1){
res -= a[i] - a[n+m];
}else{
res -= b[i] - b[n+m];
}
}
cout<<res<<' ';
}
}
cout<<'\n';
}
int main() {
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}