zoukankan      html  css  js  c++  java
  • 第二次组队赛之:Expanding Rods&&Aggressive cows&&Can you solve this equation?&&Strange fuction

                                                        Expanding Rodshttp://poj.org/problem?id=1905

    思路;先是一定要想到数学模型!!!

    从题目类型就是用二分法的:(以前应该做过的)就是一段圆的弧长

    注意是对半径进行二分!!(弧长公式:半径乘对应的角度)(一定要找到进行二分的对象)

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 #include<math.h>
     5 using namespace std;
     6 double l;
     7 double f(double a)
     8 {
     9     return 2*asin(l/(a*2))*a;//反三角sin()
    10 }
    11 double g(double b)
    12 {
    13     return b-sqrt(b*b-l*l/4);
    14 }
    15 int main()
    16 {
    17     double n,c,r1,r2,L,mid;
    18     while(scanf("%lf%lf%lf",&l,&n,&c)!=EOF)
    19     {
    20         if(l<0&&n<0&&c<0)
    21             break;
    22         if(l==0||n==0||c==0)
    23         {printf("0.000
    ");continue;}
    24         r1=l/2;//左半径最小应大于这个数。
    25         r2=l;//注意一个数学的简单现象半径越长,弧长越短。
    26         L=(1+n*c)*l;
    27         while(f(r2)>L)
    28             r2=r2*2;//这里判断求一个比实际弧长小的数就行了。
    29         while(fabs(f(r1)-f(r2))>1e-9)//对半径进行二分
    30         {
    31             mid=r1/2+r2/2;
    32             if(f(mid)>L)
    33                 r1=mid;
    34             else if(f(mid)<L)
    35                 r2=mid;
    36             else
    37                 break;
    38         }
    39         printf("%.3lf
    ",g(mid));
    40     }
    41     return 0;
    42 }

                                                Aggressive cowshttp://poj.org/problem?id=2456

    二分+贪心:思路:就是把那个距离进行二分(当全部大于这个距离时,把它放大,不然就缩小)

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 using namespace std;
     5 int n,a[100005],c;
     6 int judge(int s)
     7 {
     8     int i,number=1,frontt=0;
     9     for(i=0;i<n;i++)
    10     {
    11         if(a[i]-a[frontt]>=s)
    12         {
    13             number++;frontt=i;
    14             if(number==c)
    15             return 1;
    16             }
    17     }
    18     return 0;
    19 }
    20 int main()
    21 {
    22         int i,left,right,mid;
    23         scanf("%d%d",&n,&c);
    24         for(i=0;i<n;i++)
    25             scanf("%d",&a[i]);
    26         sort(a,a+n);
    27         left=0;
    28         right=a[n-1]-a[0];
    29         while(left<=right)
    30         {
    31             mid=(left+right)/2;
    32             if(judge(mid))//判断在这个距离时,能不能全部放入
    33                 left=mid+1;
    34             else
    35                 right=mid-1;
    36         }
    37         printf("%d
    ",right);
    38     return 0;
    39 }

                            Can you solve this equation?http://acm.hdu.edu.cn/showproblem.php?pid=2199

    一个最基础的二分题:就是从一个函数入手(一般题目最后都要找到这类的函数)

     1 #include<stdio.h>
     2 #include<math.h>
     3 int main()
     4 {
     5     int y,T;
     6     scanf("%d",&T);
     7     while(T--)
     8     {
     9         double  l=0,r=100,mid,sum;
    10         scanf("%d",&y);
    11         if(y<6||y>807020306)
    12         {
    13             printf("No solution!
    ");
    14             continue;
    15         }
    16         while(r-l>1e-9)//一般都要大于这个数才准确吧。(小数点后九位)
    17         {
    18             mid=(r+l)/2;
    19             sum=pow(mid,4)*8+7*pow(mid,3)+mid*mid*2+3*mid+6;
    20             if(sum>y)
    21                 r=mid;
    22             else if(sum<y)
    23                 l=mid;
    24             else if(sum==y)
    25                 break;
    26         }
    27         printf("%.4lf
    ",mid);
    28     }
    29     return 0;
    30 }

                                         Strange fuctionhttp://acm.hdu.edu.cn/showproblem.php?pid=2899

    一个基础的三分题目:(不必多说,一般此类题目的裸体就是这个样子。)

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 #include<math.h>
     5 using namespace std;
     6 double y;
     7 double dis(double x)
     8 {
     9     return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*x*x-y*x;
    10 }
    11 int main()
    12 {
    13     double left,right,mid,mmid,t2,t1;
    14     int t;
    15     scanf("%d",&t);
    16     while(t--)
    17     {
    18         scanf("%lf",&y);
    19         left=0;right=100;
    20         while(right-left>1e-9)
    21         {
    22             mid=left/2+right/2;
    23             mmid=mid/2+right/2;
    24             t2=dis(mid);t1=dis(mmid);
    25             if(t2>t1)
    26             {
    27                 left=mid;
    28             }
    29             else if(t2<t1)
    30             {
    31                 right=mmid;
    32             }
    33             else
    34                 break;
    35         }
    36         printf("%.4lf
    ",t1);
    37     }
    38     return 0;
    39 }
  • 相关阅读:
    使用Index()+Match()函数实现更为灵活的VLookUp()
    Hexo搭建博客笔记
    Jenkins自动化部署项目
    Ubuntu安装docker
    Ubuntu的简单使用
    ansible之Ad-Hoc
    redis的集群
    redis的主从复制和哨兵
    redis的持久化存储
    redis数据库基础
  • 原文地址:https://www.cnblogs.com/tt123/p/3226610.html
Copyright © 2011-2022 走看看