Codevs 1507 酒厂选址

来源:互联网 发布:知乎女神王麟 编辑:程序博客网 时间:2024/05/01 02:27

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 longusing 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;}
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 心累迷茫想哭怎么办 白天很累晚上又睡不着怎么办 发型睡觉压乱了怎么办 通宵一夜第二天怎么办 夏天了腿脚还凉怎么办 咖啡色三天了月经还是下不来怎么办 睡觉姿势不对腰疼怎么办 来月经吃了香瓜怎么办 减肥期间晚上有饭局怎么办 减肥期间遇到晚上聚餐怎么办 婴儿脸不向上睡怎么办 睡觉压奶了疼怎么办 堵奶了挤不下来怎么办 孕36周胎儿腿短怎么办 孕晚期胎儿腿短怎么办 孕晚期宝宝腿短怎么办 手劳累过度麻痛怎么办 大人发烧40不退怎么办? 颈椎扯的脑袋疼怎么办 孕妇颈椎痛导致失眠怎么办 做完运动脊椎中间痛怎么办? 阴虛阴虚火旺怎么办 脸一躺下就丑怎么办 身体淤堵的厉害怎么办 怀孕晚期脚肿了怎么办 宝宝感冒咳嗽流鼻涕流泪怎么办 孕晚期睡觉习惯面朝右怎么办 鼻涕一直不停的流怎么办 宝宝一直流清鼻涕怎么办 感冒了眼睛酸胀流泪怎么办 五个月宝宝感冒流鼻涕怎么办 六个月宝宝感冒流鼻涕怎么办 一岁宝宝感冒咳嗽流鼻涕怎么办 七个月宝宝感冒流鼻涕咳嗽怎么办 孩子握笔姿势不正确怎么办 走久了脚底板痛怎么办 不会给宝宝拍嗝怎么办 打了肉毒素淤青怎么办 新生儿一吃母乳就睡觉怎么办 10岁半宝宝缺钾怎么办 宝宝吃不到乳晕怎么办