酒厂选址

news/2025/3/16 1:19:27/

【问题描述】

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

  任务:请设计一个程序,读入城市的数目、相邻两城市间的距离以及每个城市消费啤酒的桶数,计算和输出最小的日运费。

【输入格式】

  第1行:一个整数N,表示城市数量。城市沿环岛高速编号,所以相邻两城市的编号也是相邻的(城市1和城市N被认为是相邻的)。
  以下N行,每行两个非负整数。第i+1行的数Zi和Di分别是第i个城市每天消费啤酒桶数和到下一个城市的距离(千米)。环岛高速的总长不超过1000000千米。每座城市的日消费量不超过1000桶。

【输出格式】

  一个整数,表示日运费的最小值。

【输入样例】

5
1 2
3 2
2 6
1 3
2 2

【输入样例解释】
  样例给出的图形如下,其中黑色数字表示城市编号,括号里的蓝色数字表示该城市的消费,红色数字表示相邻城市之间的距离。
     这里写图片描述
     

【输出样例】

21

【输出样例解释】
  酒店可建设在城市1、城市2、城市3、城市4、城市5的日运送费用计算如下表:
这里写图片描述

  所以,酒厂建在城市2时,日运送费用最少,为21。

【数据范围】

  对于50%的数据有:5<=N<=5000
  对于100%的数据有:5<=N<=100000,环岛高速的总长不超过1000000千米。每座城市的日消费量不超过1000桶。

很容易看出这是一道中位数的题,我们也容易想到要破环,但重点就在于不能超时(所以不能用暴力)。我们会发现每次破环后,中位数是只往后退,不会前进的(毕竟前面的少了,后面的多了),所以我们可以直接看它需要往后退多少。
然后就需要一下计算了,详见代码注释:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=200005;
const int inf=1000000000;
int a[maxn],n,d[maxn],totd=0,tota=0,g[maxn];int read()
{int x=0,ok=0;char ch;ch=getchar();while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();while((ch>='0'&&ch<='9')||ch=='-'){if(ch=='-') ok=1;else x=x*10+ch-'0';ch=getchar();}return ok==1?-x:x;
}void init()
{n=read();d[1]=0;g[0]=0;for(int i=1;i<=n;i++){a[i]=read();g[i]=g[i-1]+a[i];//酒的前缀和。tota+=a[i];d[i+1]=read()+d[i];//距离(1为起点)。}totd=d[n+1];for(int i=1;i<=n;i++){a[i+n]=a[i];d[n+i]=d[i]+totd;g[i+n]=g[i+n-1]+a[i];}
}int main()
{//freopen("winery.in","r",stdin);//freopen("winery.out","w",stdout);init();long long ans=100000000000000ll,q=0;int t=1;//先假设中位数是1.for(int i=1;i<=n;i++){int k=0;while(g[t+k]-g[i-1]<tota-(g[t+k]-g[i-1])) k++;//看要退几个.if(i==1){for(int j=1;j<=n;j++)q+=a[j]*abs(d[k+t]-d[j]);//第一次需要暴力算花费。}if(i>1){q-=(d[t]-d[i-1])*a[i-1];//减去这次去掉的点的花费。q-=(tota-(g[t+k-1]-g[i-2]))*(d[t+k]-d[t]);//中位数以后的点比之前要少的花费(不算多加的点)。for(int p=1;p<k;p++)//2次中位数直接的点的花费(重新算)。{q-=a[t+p]*(d[t+p]-d[t]);q+=a[t+p]*(d[t+k]-d[t+p]);}q+=(d[t+k]-d[t])*(g[t]-g[i-1]);//上一个中位数之前的点多的花费(不算去掉的点)。q+=(d[i-1+n]-d[t+k])*a[i-1];//多的那个点的花费.}ans=min(ans,q);t=t+k;}cout<<ans;return 0;
}

http://www.ppmy.cn/news/320562.html

相关文章

1000瓶酒的思考

上次我在星网锐捷笔试中&#xff0c;有道题目是这样的 在一个part中有准备了1000瓶酒&#xff0c;但其中有一瓶是毒酒&#xff0c;要求用最少的囚犯测出毒酒 毒酒发作时间略短于part开始的时间&#xff0c;发作后囚犯会死。&#xff08;这里暗示每个囚犯只能喝一次酒&#xf…

酒旅项目总结

项目里程碑 项目里程碑下图是项目原计划的时间线 项目技术架构 下面介绍各个技术&#xff1a; DNS&#xff08;Domain Name Server&#xff0c;域名服务器&#xff09;是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器。DNS中保存了一张域名(domain n…

新瓶子装老酒!!!

请定义一个函数&#xff0c;比较两个整数a、b的大小&#xff0c;不能使用大于、小于、if语句。 心得&#xff1a;看到这个问题&#xff0c;你大脑也许是空白的&#xff0c;这很正常&#xff0c;不知道大家又没有这种想法&#xff0c;我自学习c就知道比较两个数的大小就很简单&a…

这个爱喝酒的酒鬼可真是让人操碎了心

全世界只有3.14 % 的人关注了 数据与算法之美 最近又有一道数学难题重现江湖&#xff0c;在数学的江湖上掀起了腥风血雨。 为了这道题&#xff0c;武林中也衍生出了三个门派&#xff01;分别有75%派&#xff0c;90%派&#xff0c;50%派。 打完这么多派字&#xff0c;怎么莫名有…

高端啤酒正在失去年轻人

文|螳螂观察 作者| 青月 尽管奢侈品的外延近年来不断拓展&#xff0c;但大众从未想到过&#xff0c;奢侈品有一天会和啤酒挂上钩。 打开百威啤酒的天猫官方旗舰店&#xff0c;在“纯粹甄选”分类里有价格为218元/瓶的798ml“百威大师臻藏”。宣传海报里在强调是“大师礼遇”…

转载:中国部分酱香型白酒名录

下面是部分酱香型白酒分布情况&#xff1a; 北京市&#xff1a;华都酒 燕岭春 通洲老窖 燕都酒 天津市&#xff1a;芦台春 黑龙江&#xff1a;龙滨酒 陈酿红粮 北大仓 阿什河酒 龙江春 吉林市&#xff1a;吉林茅酒 九龙泉陈酿 新辽河 津泉酒 大泉源 新辽河酒 江城酒…

回味陈年老酒----DOS

在Windows已经进化到 Vista 的今天&#xff0c;想必已经很少人会想起我们还有一个DOS朋友&#xff0c;呵呵最近在处理一些文件发布方面的事情的时候&#xff0c;用到了一些DOS相关的东西&#xff0c;例如创建时间戳的目录例如用bat调用Xcopy命令来把一组文件发布到十几台服务器…

程序员的酒后真言,都不容易

平时工作累了&#xff0c;空(mo)闲(yu)时最喜欢逛的个人博客之一就是阮一峰老师的博客&#xff0c;昨天他的博客平台看到一篇文章(https://www.ruanyifeng.com/blog/2021/06/drunk-post-of-a-programmer.html)&#xff0c;非常有意思&#xff0c;某一程度上也道出了程序员朋友们…