B - 简易版之最短距离
[by_041]
题目理解
- 首先,~~先嘲讽一下这个ACBOY的名字,~~他要选一个出发点
- ~~再看看他所有的朋友怎么都在数轴上啊,~~然后访问其他点
- 那么按照这个数据范围 n ≤ 500 , v ≤ 10000 n\le500,v\le10000 n≤500,v≤10000,~~这不就很简单了吗,~~枚举应该都能过
- 但是考虑到他在数轴上,,嗯~有那味儿了,我们来看一下:
组 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | X | X | |||||||||
2 | X | X | X | ||||||||
3 | X | X | X | X | |||||||
4 | X | X | X | X | X | X |
-
上表中的前俩组来源测试数据,后俩组就是41随便编的了
-
参考上方的数据,
-
如果只有俩朋友(比如组1),选左或右答案都是一致的
-
有仨小伙的时候(比如组2),设左娃子和中娃子间隔 x 1 x_1 x1,中右间隔 x 2 x_2 x2
那么选左中右的方案的花费分别是:
-
2 x 1 + x 2 2x_1+x_2 2x1+x2
-
x 1 + x 2 x_1+x_2 x1+x2
-
x 1 + 2 x 2 x_1+2x_2 x1+2x2
明显是选中间划算。。。哦豁🤭,这么说奇数个小朋友的时候答案跟选中间的很有可能有关吼i
-
-
接下来看看,如果有四个朋友,俩俩相邻的朋友的间隔是 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3
那么选择四个人的花费分别就是
- 3 x 1 + 2 x 2 + x 3 3x_1+2x_2+x_3 3x1+2x2+x3
- x 1 + 2 x 2 + x 3 x_1+2x_2+x_3 x1+2x2+x3
- x 1 + 2 x 2 + x 3 x_1+2x_2+x_3 x1+2x2+x3
- x 1 + 2 x 2 + 3 x 3 x_1+2x_2+3x_3 x1+2x2+3x3
明显也是选择中间划算噢😄,偶数而且选中间俩的时候还莫得区别
-
-
。。。。。。
-
综上,只要选择中间的就行了嘛
-
回看一下题目,值得注意的是这里的数据不一定是有序的,记得排序噢
-
那就码咯:
#include<cstdio>
#include<algorithm>
int input()
{char ch;
while((ch=getchar())<'0'||ch>'9');
int ret=ch-'0';
while((ch=getchar())>='0'&&ch<='9')
ret=(ret<<1)+(ret<<3)+ch-'0';
return ret;
}
int m,n,anss,mid_va,mid_lo,a[1001];
int main()
{
m=input();
while(m--)
{
anss=0;
n=input();
for(int i=0;i<n;i++)
a[i]=input();
std::sort(a,a+n);
// for(int i=0;i<n;i++)
// printf("%d ",a[i]);
mid_va=a[mid_lo=n>>1];
for(int i=0;i<mid_lo;i++)
anss+=mid_va-a[i];
for(int i=mid_lo+1;i<n;i++)
anss+=a[i]-mid_va;
printf("%d\n",anss);
}
return 0;
}
- 自然のA了、