[ACM] CSU 1548 Design road (三分)

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1548

第一次接触三分,题意和代码参考的网上的。

题意:修路:从(0,0)~(x,y),n个数表示有第二行开始有n行表示有n条河,tx是河的起始位置,ty是河的宽度,有水的地方要修桥,而x,y表示修路的端点,C1表示修路每米的花费,C2表示修桥每米的花费,问你最后花费的最少金额!

思路:先把有河的地方都和到一起,然后它的宽度就知道了,那么就把高度三分,找花费最小的点

这里三分求的是最小值。

三分法介绍

在区间内用两个mid将区间分成三份,这样的查找算法称为三分查找,也就是三分法,三分法常用于求解单峰函数的最值。

还有一种理解,即在二分查找的基础上,在左区间或者右区间上再进行一次二分。

三分与二分的区别

二分法适用于单调函数,而单峰函数用二分明显不太好了,对于有些单峰函数,可以求导后转化为单调函数,从而使用二分,然而很多情况求导是很麻烦的,这时就需要用到三分了。

const int inf=0x3f3f3f3f;
int n;
double x,y,c1,c2,sum,ans;
const double eps=1e-8;

double dis(double x1,double y1,double x2,double y2)
{
    return hypot(x1-x2,y1-y2);
}

void fen3(double l,double r)//求最小值
{
    double mid1=l+(r-l)/3;
    double mid2=l+(r-l)*2/3;
    double s1=dis(0,0,sum,mid1)*c2+dis(sum,mid1,x,y)*c1;
    double s2=dis(0,0,sum,mid2)*c2+dis(sum,mid2,x,y)*c1;
    if(fabs(s1-s2)<eps)
    {
        ans=s2;
        return;
    }
    if(s1>s2)
        fen3(mid1,r);
    else
        fen3(l,mid2);
}
int main()
{
    while(scanf("%d%lf%lf%lf%lf",&n,&x,&y,&c1,&c2)!=EOF)
    {
        sum=0;
        for(int i=1;i<=n;i++)
        {
            double tx,ty;
            scanf("%lf%lf",&tx,&ty);
            sum+=ty;
        }
        fen3(0,y);
        printf("%.2f\n",ans);
    }
    return 0;
}
时间: 2024-10-12 20:06:13

[ACM] CSU 1548 Design road (三分)的相关文章

csu 1548: Design road(三分)

1548: Design road Time Limit: 2 Sec  Memory Limit: 256 MB Submit: 243  Solved: 115 [Submit][Status][Web Board] Description You need to design road from (0, 0) to (x, y) in plane with the lowest cost. Unfortunately, there are N Rivers between (0, 0) a

三分 --- CSU 1548: Design road

Design road Problem's Link:   http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1548 Mean: 目的:从(0,0)到达(x,y).但是在0~x之间有n条平行于y轴的河,每条河位于xi处,无限长,wi宽,并分别给出了建立路和桥每公里的单价 求:到达目标的最小费用. analyse: 比赛的时候一直没想到思路,第二个样列怎么算都算不对,赛后才知道是三分. 首先把所有的桥移到最右端,然后三分枚举路和河的交点. Time

CSU 1548 Design road(三分查找)

题目链接:https://cn.vjudge.net/problem/142542/origin Description You need to design road from (0, 0) to (x, y) in plane with the lowest cost. Unfortunately, there are N Rivers between (0, 0) and (x, y).It costs c1 Yuan RMB per meter to build road, and it

csu 1548: Design road (三分)

题意:需要从(0,0) 点 到(x,y) 修一段路 其中有n条和y轴平行的河 修路的单位成本c1 修桥的单位成本c2 问最小总成本为多少 思路:把所有河合并 再三分桥的长度 求出最小成本 #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<stdlib.h> #include<algorithm> #include<queu

1548: Design road (思维题 做法:三分找极值)

1548: Design road Submit Page    Summary    Time Limit: 2 Sec     Memory Limit: 256 Mb     Submitted: 450     Solved: 237 Description You need to design road from (0, 0) to (x, y) in plane with the lowest cost. Unfortunately, there are N Rivers betwe

csu 1548(三分)

1548: Design road Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: 383  Solved: 200[Submit][Status][Web Board] Description You need to design road from (0, 0) to (x, y) in plane with the lowest cost. Unfortunately, there are N Rivers between (0, 0) and

[ACM] CSU 1553 Good subsequence(尺取法)

题目地址:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1553 给定n的数的序列,求最长连续区间满足区间内的数最大值与最小值的差<=k (尺取法) const int maxn=10010; int num[maxn]; int n,k; int MIN,MAX; int main() { while(scanf("%d%d",&n,&k)!=EOF) { for(int i=1;i<=n;i++) sc

湖南多校对抗赛(2015.03.28) B Design road

题意:给你起点(0,0),终点(x,y),中间有很多条河, 在河上面建桥花费c1,在陆地建路花费c2,问你最小花费是多少. 解题思路:我们知道,我们考虑的时候完全可以把河都移动到一边来求,这样只需要三分就行了. 解题代码: 1 // File Name: b.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月28日 星期六 13时26分39秒 4 5 #include<vector> 6 #include<list> 7 #

HDU ACM 2438 -&gt;Turn the corner 三分求最值

分析:主要参考http://m.blog.csdn.net/blog/yinzm520/22721285这里的解题方法. 关键是要找到小车的运动状态,下面是分析和公式推导: 在小车转弯过程中,黄线是不断地变化的,变化规律是先增大再减小.所以抓住这一点,用三分法.先找一个变量,角度sita(就是上图中用红色标记的那个角),之后就是一系列的推导,算出黄线的长度.角度的范围是(0,pi/2). 当三分找出最长的黄线长度之后,使之与Y做比较,当它小于Y时,就说明能够通过了 最终可得到:f(angle)=