sgu158:Commuter Train

来源:互联网 发布:数据的一致性和完整性 编辑:程序博客网 时间:2024/05/18 03:56
题意:
数轴上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;}

0 0