5月2日,9:00-12:00,西工大校赛

1.A题:

比赛的时候WA了7次,导致排名较低。

WA的7次都是用暴力和STL做的。

正确思路:先用计数法记录员工所在的号数,然后遍历数组,找到每一个工位之前的号数和与员工数量和,最后将所有工位用a,mid,b分成四部分,对每一部分求ans即可。

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define maxn 100000
int arr[maxn+1]={0};
int num[maxn+1]={0};
int hao[maxn+1]={0};
int main()
{
int n,q,i,j,k,a,b,m;
scanf("%d%d",&n,&q);

for(i=0;i<n;i++)
{
scanf("%d",&j);
arr[j]++;
}
for(i=2;i<=maxn+1;i++)
{
hao[i]=hao[i-1]+arr[i-1]*(i-1);
num[i]=num[i-1]+arr[i-1];
}
while(q--)
{
scanf("%d%d",&a,&b);
if(a>b)
{
int tem=a;
a=b;
b=tem;
}
int ans=0;
int mid=(a+b)/2;
ans+=a*num[a]-hao[a];
ans+=(hao[mid+1]-hao[a+1])-a*(num[mid+1]-num[a+1]);
ans+=b*(num[b]-num[mid+1])-(hao[b]-hao[mid+1]);
ans+=(hao[maxn+1]-hao[b+1])-b*(num[maxn+1]-num[b+1]);
printf("%d ",ans);
}
return 0;
}

原文地址:https://www.cnblogs.com/chengxvzhishen/p/12856322.html