题意:
数轴上0到L的区间,有M个不动点P,N个可动点D(要动就一起动相同的位移)。
求出一个S(即Di=>Di+S,i∈[1,N]),使得每个P到最近的D的距离总和最大,并且满足所有的点都在区间上。
给出P的坐标,给出D2,D3,...,DN到D1的距离,给出L,输出最大距离时的S与最大距离。
L∈(0,5000],N∈(0,300],M∈(0,300]。
分析:
yy一下我们可以知道,答案一定在S要么是整数,要么是xx.5。
然后暴力就好啦!
数轴上0到L的区间,有M个不动点P,N个可动点D(要动就一起动相同的位移)。
求出一个S(即Di=>Di+S,i∈[1,N]),使得每个P到最近的D的距离总和最大,并且满足所有的点都在区间上。
给出P的坐标,给出D2,D3,...,DN到D1的距离,给出L,输出最大距离时的S与最大距离。
L∈(0,5000],N∈(0,300],M∈(0,300]。
分析:
yy一下我们可以知道,答案一定在S要么是整数,要么是xx.5。
然后暴力就好啦!
#include <cstdio>
#include <cmath>
using namespace std;
int dis(int d, int s, int p){return abs(d+s-p);}
int main()
{
int L = 0, M = 0, N = 0;
int P[305] = {0}, D[305] = {0};
scanf("%d%d", &L, &M);
L <<= 1;
for(int i = 1; i <= M; ++i)
{
scanf("%d", P+i);
P[i] <<= 1;
}
scanf("%d", &N);
for(int i = 2; i <= N; ++i)
{
scanf("%d", D+i);
D[i] <<= 1;
}
D[N+1] = 1e9;
int S = 0, ans1 = -1, ans2 = -1;
for(; S <= L && S+D[N] <= L; ++S)
{
int sum = 0;
for(int i = 1, j = 1; i <= M; ++i)
{
while(1)
{
int a = dis(D[j], S, P[i]), b = dis(D[j+1], S, P[i]);
if(a < b) {sum += a;break;}
else j++;
}
}
if(sum > ans2)
{
ans1 = S;
ans2 = sum;
}
}
if(ans1&1) printf("%d.5 ", ans1>>1);
else printf("%d ", ans1>>1);
if(ans2&1) printf("%d.5\n", ans2>>1);
else printf("%d\n", ans2>>1);
return 0;
}