两道二分coming~

第一道:poj 1905Expanding Rods

题意:两道墙(距离L)之间架一根棒子,棒子受热会变长,弯曲,长度变化满足公式( s=(1+n*C)*L),求的是弯曲的高度h。

首先来看这个图:

如图,蓝色为杆弯曲前,长度为L

红色为杆弯曲后,长度为s

h是所求。

又从图中得到三条关系式;

(1)       角度→弧度公式  θr = 1/2*s

(2)       三角函数公式  sinθ= 1/2*L/r

(3)       勾股定理  r^2 – ( r – h)^2 = (1/2*L)^2

把四条关系式化简可以得到

逆向思维解二元方程组:

要求(1)式的h,唯有先求r

但是由于(2)式是三角函数式,直接求r比较困难

因此要用顺向思维解方程组:

在h的值的范围内枚举h的值,计算出对应的r,判断这个r得到的(2)式的右边  与 左边的值S的大小关系  ( S= (1+n*C)*L )

很显然的二分查找了。。。。。

看代码:

 1 #include<stdio.h>
 2 #include<string>
 3 #include<math.h>
 4 #include<string.h>
 5 #include<algorithm>
 6 #define esp 1e-5
 7 using namespace std;
 8 int main()
 9 {
10     double l,n,c,s,h,r;
11     while(scanf("%lf%lf%lf",&l,&n,&c)!=EOF)
12     {
13         if(l==-1&&n==-1&&c==-1)
14             break;
15         s=(1+n*c)*l;
16         double low=0.0,high=l*0.5,mid;
17         while(high-low>esp)
18         {
19             mid=(low+high)/2;
20             r=(4*mid*mid+l*l)/(8*mid);
21             if(2*r*asin(l/(2*r))<s)
22                 low=mid;
23             else
24                 high=mid;
25         }
26         printf("%.3lf\n",mid);
27     }
28     return 0;
29 }

第二题:poj 3122 Pie

题意:f+1个人分n个派。

要求:每个人的派的体积一样大且尽量最大,每个人的派必须来自同一个派。

二分题,千万要注意,输入的是朋友的数量f,分pie是分给所有人,包括自己在内共f+1人

下界low=0,即每人都分不到pie

上界high=maxsize,每人都得到整个pie,而且那个pie为所有pie中最大的

对当前上下界折中为mid,计算"如果按照mid的尺寸分pie,能分给多少人"

求某个pie(尺寸为size)按照mid的尺寸,能够分给的人数,就直接size / mid,舍弃小数就可以

看代码:

#include<stdio.h>
#include<string>
#include<math.h>
#include<string.h>
#include<algorithm>
#define pi 3.14159265359
#define esp 1e-6
using namespace std;
int main()
{
    int t;
    int n,f,maxs;
    double v;
    double r[10001];
    double s[10001];
    scanf("%d",&t);
    while(t--)
    {
        maxs=0.0;
        int ans=0;
        scanf("%d%d",&n,&f);
        f++;
        for(int i=0;i<n;i++)
        {
            scanf("%lf",&r[i]);
            s[i]=r[i]*r[i];
            if(maxs<s[i])
                maxs=s[i];
        }
        double low=0.0,high=maxs,mid;
        while(high-low>esp)
        {
            mid=(low+high)/2;
            ans=0;
            for(int i=0;i<n;i++)
            {
                ans+=(int)(s[i]/mid);
            }
            if(ans<f)
                high=mid;
            else
                low=mid;
        }
        printf("%.4lf\n",mid*pi);
    }
    return 0;
}
时间: 2024-10-29 07:14:58

两道二分coming~的相关文章

ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)

两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory:360K #include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> using namespace std; #define

两道有意思的题目

碰到两道有意思的题目,记录一下. 题目一: 问,对于任意一个正整数,是否存在一个它的倍数全是由1和0组成? 例如: 1 * 1 = 1 2 * 5 = 10  (2的5倍是10,10由1和0组成) 3 * 37 = 111 (3 的 37 倍是111,111 全部由1组成) 4 * 25 = 100 (4 的 25 倍是100,100 由1和0组成) 5 * 20 = 100 (5 的 20 倍是100,100由1 和 0 组成) …… 现在需要判断,随便给一个正整数,是否存在一个它的倍数满足题

[sdut]2623+[sdut]2878//四五届省赛中的两道数学期望

两道数学期望的题今天一起总结上来. 1.the number of steps(第四届省赛) 1 #include <iostream> 2 #include <string.h> 3 #include <iomanip> 4 using namespace std; 5 double dp[100][100]; 6 int n; 7 double a,b,c,d,e; 8 9 int main() 10 { 11 while(cin>>n&&

分享两道笔试题目

前几天,给成都的某家公司投了个简历,给发了两道笔试题目,与大家分享一下.附上自己的解题过程,写得不好的地方,还请博友多多指教. 一 .  设计程序输出销售及收费清单 一个电商平台对在其平台之上销售的除了书籍.食品以及药物以外的商品收取 10% 的费用.而对于进口的商品则额外收取 5% 的附加费用.对于平台抽取的费用计算时,舍入的规则是:对于 n% 抽取率,价格为 p的商品, np/100 的值就近舍入到 0.05(如: 7.125 -> 7.15, 6.66 -> 6.70 ). 卖家卖出一些

告诉我图样图森破的两道简单C++笔试题

今晚刷了一大堆的笔试题,中规中矩,但是有两道做得很快但是都错了的题目,印象深刻. (要找工作的大四渣有没有共鸣,在学校明明很努力,但是总是跟不上时代,没有厉害的项目,也没有过人的竞赛成绩,内推屡屡失败,前天阿里巴巴在线笔试也被虐死,真心迷惘,唯独刷题搞笔试了.) 第一道题是关于宏定义的. #include<iostream> using namespace std; #define fun(n) (n-1)*n int main() { int x=3; cout<<fun(x+3

两道笔试题的感触

今天做了两道笔试题,收益良多.有些题,你会发现,虽然并不难,但是却很容易没有思路或者出错,这都是源自平时的不求甚解.很多知识点,自以为已经掌握,其实只是管中窥豹,可见一斑.不要一味墨守成规,也要用于思考,很多东西既要知其然,也要知其所以然.我一直觉得了解和精通中间差着十万八千里,看来还有很长一段路要走.只有比别人更早.更勤奋地努力,才能尝到更加成功的滋味.哈哈,跑题了. 下面看一下两道笔试题.一.大概简单地说一下,求下面这段代码的结果. new Thread(new Runnable() { p

水了两道括号匹配

POJ 1141 给一段括号序列,要求增加最少的括号,使之合法,输出序列. dp[i][j]表示使给定序列的i到j成为合法序列所需添加的最少括号数,dp[0][length-1]即是答案,转移的话,如果s[i]和s[j]可以匹配那么dp[i][j] = dp[i+1][j-1],否则就考虑在中间选择一个位置m,使分割成的两个序列各自成为合法序列.方案的话就是多开一个数组记录然后递归输出.状态是从长度小的序列转移到长度长的序列,所以两层循环,外层枚举长度,内层枚举头位置即可.写成记忆化搜索简单一点

黑马程序员 &nbsp; 两道java面试题

1.List,Set,Map是否都继承了Collection接口?  List,Map比较常用:List是通过下标来访问元素,Map是通过键值进行访问元素.应该不会同时都实现了Collection接口.  Collection是一个什么概念?还有Set在java中是怎样定义的?他是通过下标来访问元素还是通过键值来访问元素?两者谁继承了Collection接口呢?或者有没有可能两者都继承了Collection接口?时间不多了,我是这样写的:  Set,Map实现了Collection接口.而Lis

两道拓扑排序的问题

多久没写东西了啊.... 两道拓扑排序Liv.1的题....方法是一样的~~ <拓扑排序·二> 题目:http://hihocoder.com/contest/hiho81/problem/1 一个电脑网路,单向边,如果存在边u->v,那么u的病毒会感染到v. 要点,不存在环!那么如果u的入度=0的话,那么u中的病毒数不会再变化. 想到拓扑排序.不断删去入度为0的点.每次删去节点u,如果存在u->v,那么病毒数 num[v] += num[u].问题解决. (用queue实现拓扑排