1507 酒厂选址

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 黄金 Gold

传送门

题目描述 Description

Abstinence(戒酒)岛的居民们酷爱一种无酒精啤酒。以前这种啤酒都是从波兰进口,但今年居民们想建一个自己的啤酒厂。岛上所有的城市都坐落在海边,并且由一条沿海岸线的环岛高速路连接。酒厂的投资者收集了关于啤酒需求量的信息,即每天各城市消费的啤酒桶数。另外还知道相邻城市之间的距离。每桶啤酒每英里的运费是1元。日运费是将所需要的啤酒从酒厂运到所有城市所必需的运费之和。日运费的多少和酒厂的选址有关。投资者想找到一个合适的城市来修建酒厂,以使得日运费最小。

请设计一个程序:从文件bre.in 读入城市的数目、相邻两城市间的距离以及每个城市消费的啤酒桶数,计算最小的日运费,将结果写到输出文件bre.out中。

输入描述 Input Description

第一行是一个整数n(5 <= n <= 10000) ,表示城市的数目。 城市沿高速路编号,使得相邻的城市的编号也相邻(城市1和n也被认为是相邻)。 以下的n行,每行有两个非负整数。第I+1行的数 zi、di分别是城市I每日的啤酒消费量(桶)和从城市I沿高速路到下一个城市的距离(英里)。高速路的总长不会超过65535 英里。每座城市的日消费量不会超过255桶。

输出描述 Output Description

一个整数,表示所需的最小日运费(元)。

样例输入 Sample Input

6

1 2

2 3

1 2

5 2

1 10

2 3

样例输出 Sample Output

41

数据范围及提示 Data Size & Hint

分类标签 Tags

启发式搜索 模拟 搜索

/*
n^2做法.
一开始搞了一个前缀和和一个后缀和.
然后跑的时候傻眼了(可能有负的然后各种特判)
又看了看图
处理所有权值
反向跑的时候减去正向跑的权然后取小
一个前缀和就搞定了.
ans 可能会特别大(巨坑).
*/
#include<iostream>
#include<cstdio>
#define MAXN 10001
#define LL long long
using namespace std;
LL tot=1e18;
int n,s[MAXN],t[MAXN],max1;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&t[i],&s[i]);
max1+=s[i];
s[i]+=s[i-1];
}
for(int k=1;k<=n;k++)
{
LL ans=0;
for(int i=1;i<=n;i++)
{
int x=k,y=i;
if(x>y) swap(x,y);
ans+=min(s[y-1]-s[x-1],max1-(s[y-1]-s[x-1]))*t [i];
}
tot=min(tot,ans);
}
printf("%lld",tot);
return 0;
}
/*
o(n)做法.
二分答案类似.
闲的我比着Pascal题解打了一遍.
枚举酒厂位置,
可以找到从一个点开始为分界,
一部分点跑左边,一部分跑右边,
该点记为mid,
mid会随着酒厂的右移而右移,具有二分性。
每次移动时计算答案贡献.
*/
#include<iostream>
#include<cstdio>
#define MAXN 10001
using namespace std;
long long tot,best,ans,ansm,mid,ans1mid,ans2mid;
long long l,r,min1,s[MAXN],t[MAXN],n,m,tots,tott;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&t[i],&s[i]);
tots+=s[i];tott+=t[i];
}
for(int i=0;i<n;i++)//确定第一次mid的位置.
{
m+=s[i];
min1+=t[i];
if(m>(tots>>1))
{
mid=i;
m-=s[i];
l=min1;
r=tott-min1;
break;
}
}
for(int i=1;i<=mid;i++)//正向累加.
{
tot+=s[i-1];
ans+=t[i]*tot;
}
tot=0;
for(int i=n-1;i>=mid+1;i--)//反向累加.
{
tot+=s[i];
ans+=t[i]*tot;
}
best=ans;//best最优解.
for(int i=1;i<n;i++)
{
m-=s[i-1];
l-=t[i-1];
ans1mid=mid;
while(m<=(tots>>1))//求新的中间位置.
{
m+=s[mid];
mid=(mid+1)%n;
l+=t[mid];
}
l-=t[mid];
mid=(mid+n-1)%n;
m-=s[mid];
r=tott-l;
ans2mid=mid;
ansm=m;
while(ans2mid!=ans1mid)
{
ans+=t[ans2mid]*(ansm+s[i-1]-(tots-ansm-s[i- 1]));
ans2mid=(ans2mid+n-1)%n;
ansm-=s[ans2mid];
}
ans+=(r-l)*s[i-1];
best=min(best,ans);
if(i==mid)//特殊情况.
{
m=tots;
l=tott;
ans=0;
int tj,j=(i+1)%n;
tj=s[i];
while(j!=i)
{
ans+=t[j]*tj;
tj+=s[j];
j=(j+1)%n;
}
}
}
printf("%lld",best);
return 0;
}

Codevs 1507 酒厂选址的更多相关文章

  1. codevs——1507 酒厂选址

    1507 酒厂选址  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description Abstinence(戒酒) ...

  2. codevs 1507酒厂选址

    #include<cstdio> #include<cstdlib> using namespace std; int n; int dis[10010],a[10010],x ...

  3. 酒厂选址(codevs 1507)

    题目描述 Description Abstinence(戒酒)岛的居民们酷爱一种无酒精啤酒.以前这种啤酒都是从波兰进口,但今年居民们想建一个自己的啤酒厂.岛上所有的城市都坐落在海边,并且由一条沿海岸线 ...

  4. 2018.10.20 2018NOIP冲刺之酒厂选址

    题目传送门 明显能够看出有一个建图求路程的优化 然而发现10000*10000爆空间QAQ 为了做一些初始化方面的优化 我们发现了一个叫做前缀和的东西 可以在环上查到两个之间的最短距离 同时还要做一些 ...

  5. codevs 搜索题汇总(黄金级)

    2801 LOL-盖伦的蹲草计划  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold   题目描述 Description 众所周知,LOL这款伟大的游戏,有个叫盖 ...

  6. Codevs 3578 无线网络发射器选址== NOIP 2014 Day2 T1

    3578 无线网络发射器选址 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 白银 Silver 题目描述 Description 随着智能手机的日益普及,人们对无线网的需求日益增大. ...

  7. codevs 3289 花匠

    题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...

  8. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  9. codevs 1285 二叉查找树STL基本用法

    C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...

随机推荐

  1. HW4.8

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  2. 局域网内Linux服务器时间同步

    局域网内Linux服务器时间同步   1.将一台能够上网的服务器作为时间服务器:  # /usr/bin/rdate -s time-b.timefreq.bldrdoc.gov //将时间服务器与互 ...

  3. 问题.NETwebservice其他电脑无法使用-测试窗体只能用于来自本地计算机的请求

    问题:webservice其他电脑无法使用-测试窗体只能用于来自本地计算机的请求 问题现象: 本地测试没有问题. 其他电脑打开webservice出现 测试窗体只能用于来自本地计算机的请求. 或者 & ...

  4. AS3 IOC框架Spring Actionscript 的使用总结

    Spring Actionscript 是众多围绕依赖注入提供解决方案的Flex控制反转框架之一 AS3 下经典的IOC框架有Spring ActionScript.Parsley.Flicc和Swi ...

  5. 校友信息管理系统&SNS互动平台之用户需求及概要设计

    前言.提纲及说明: 请移步:<校友信息管理&SNS互动平台之前言.目录及说明>(博客园地址:http://www.cnblogs.com/s6cn/p/3516876.html) ...

  6. Emmet:一个Html/Css快速编辑神器的插件

    一.介绍:Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度 二.使用 ...

  7. 页面接口防刷 解决思路一nginx

    线上环境 很多接口 如果不做缓存 可能导致有人拿到url  每秒几万次的访问后台程序,导致系统down机. 此处, nginx可以加一层缓存. expires起到控制页面缓存的作用,合理的配置expi ...

  8. 一个tomcat究竟能接受多少并发

    maxThreads 对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束.如果同时进来的请求多于当前可用的请求处理线程数,额外的线程就会被创建,直到到达配置的最大线程 ...

  9. FZOJ2110 star(DFS)

    Overpower often go to the playground with classmates. They play and chat on the playground. One day, ...

  10. CENTOS运行报错java.lang.OutOfMemoryError

    java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "http-bio-8080-ex ...