sgu158:Commuter Train

题意:
数轴上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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前台: (1)注册登录模块:按照学校的相关规定进行注册和登录。 (2)招聘信息查看:高校毕业生们可以网站首页上查看所有的招聘信息,除此之外还可以输入公司名称或岗位名称进行搜索。 (3)用人单位模块:此模块为宣传用人单位的主要功能模块,具体包括用人单位简介、岗位需求及职责及公司介绍等功能。 (4)就业指导:学生朋友们在就业前可以通过此模块获取指导。 (5)新闻信息:为了让用户们可以了解到最新的新闻动态,本系统可以通过新闻信息查看功能阅读近期的新闻动态。 (6)在线论坛:毕业季的同学们可以通过此模块相互交流。 后台: (1)系统用户管理模块:可以查看系统内的管理员信息并进行维护。 (2)学生管理模块:通过此功能可以添加学生用户,还可以对学生信息进行修改和删除。 (3)用人单位管理模块:管理员用户通过此模块可以管理用人单位的信息,还可以对用人单位信息进行查看和维护。 (4)招聘管理模块:管理员通过此功能发布和维护系统内的照片信息。 (5)就业指导管理模块:通过此模块可以编辑和发布就业指导信息,从而更好的帮助就业季的同学们。 (6)论坛管理:通过论坛管理可以查看论坛中的主题帖及里面的回复信息,除此之外还可以对论坛中的信息进行维护和管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值