zoukankan      html  css  js  c++  java
  • 第二次组队赛之:Can you find it?&&Toxophily&& Party All the Time&& Squares

    Can you find it? HDU2141

    题目好理解:在输入的三行数据中(必须每行取一个数)相加与输入的值比较。

    如果用暴力肯定会超时的:那么把俩行合并,再二分。。。

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<math.h>
     4 #include<algorithm>
     5 using namespace std;
     6 int ab[501*501];
     7 int dis(int h,int q)//二分查找
     8 {
     9     int left,right,mid;
    10     left=0;
    11     right=h-1;
    12     while(left<=right)
    13     {
    14         mid=(left+right)/2;
    15         if(ab[mid]==q)
    16             return 1;
    17         else if(ab[mid]>q)
    18             right=mid-1;
    19         else if(ab[mid]<q)
    20             left=mid+1;
    21     }
    22     return 0;
    23 }
    24 int main()
    25 {
    26     int cout1=1,l,m,n,a[505],b[505],c[505],i,j,h,t,d,s,q;
    27     while(scanf("%d%d%d",&l,&m,&n)!=EOF)
    28     {
    29         h=0;
    30         for(i=0;i<l;i++)
    31             scanf("%d",&a[i]);
    32         for(i=0;i<m;i++)
    33             scanf("%d",&b[i]);
    34         for(i=0;i<n;i++)
    35             scanf("%d",&c[i]);
    36         for(i=0;i<l;i++)
    37             for(j=0;j<m;j++)
    38             ab[h++]=a[i]+b[j];//合并
    39         sort(ab,ab+h);
    40        scanf("%d",&t);
    41         printf("Case %d:
    ",cout1++);
    42         for(i=0;i<t;i++)
    43         {
    44             d=0;
    45             scanf("%d",&s);
    46             for(j=0;j<n;j++)
    47             {
    48                 q=s-c[j];
    49                 if(dis(h,q))
    50                 {
    51                     d=1;
    52                     break;
    53                 }
    54             }
    55             if(d==0)
    56                 printf("NO
    ");
    57             else if(d==1)
    58                 printf("YES
    ");
    59         }
    60     }
    61     return 0;
    62 }

    Toxophily HDU2298

    首先这是一个物理题!!(全忘记了)

    再次他们是在一个平面里的!!

    先是用纯粹的物理思想来做;

    由x=v*cos(θ)*t,y=v*sin(θ)*t-g*t*t/2,然后通过数学变形(sin(θ)^2+cos(θ)^2=1)得到方程:

    g*x*x*tan(θ)^2-2*v*v*x*tan(θ)+2*v*v*y+g*x*x=0,再用求根公式解该一元二次方程。(1+tan^2(α)=sec^2(α), cosα ·secα=1

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 
     5 using namespace std;
     6 const double PI=acos(-1.0);
     7 const double g=9.8;
     8 
     9 int main()
    10 {
    11     int t;
    12     double x,y,v;
    13     double a,b,c,d,p1,p2;
    14     cin>>t;
    15     while(t--)
    16     {
    17         cin>>x>>y>>v;
    18         a=g*x*x;
    19      b=-2*v*v*x;
    20      c=2*v*v*y+g*x*x;
    21      d=b*b-4*a*c;
    22         if(d<0)
    23         {
    24             printf("-1
    ");
    25             continue;
    26         }
    27         p1=atan((-b+sqrt(d))/a/2);
    28         p2=atan((-b-sqrt(d))/a/2);
    29         if((p1<0||p1>PI/2)&&(p2<0||p2>PI/2))
    30             printf("-1
    ");
    31         else if(p1<0||p1>PI/2)
    32             printf("%.6lf
    ",p2);
    33         else if(p2<0||p2>PI/2)
    34             printf("%.6lf
    ",p1);
    35         else
    36             printf("%.6lf
    ",min(p1,p2));
    37     }
    38     return 0;
    39 }

    之后方法参照:http://blog.csdn.net/hello_there/article/details/8519008

    Party All the Time HDU4355

    一道典型的三分题:

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<stdio.h>
     4 #include<math.h>
     5 using namespace std;
     6 int n;
     7 struct line
     8 {
     9     double bumanyi;
    10     double area;
    11 }a[50000];
    12 bool comp1(line x,line y)
    13 {
    14     return x.area<y.area;
    15 }
    16 double dis(double mid)
    17 {
    18     int i;
    19     double t;
    20     t=0;
    21     for(i=0;i<n;i++)
    22     {
    23         t+=fabs((a[i].area-mid)*(a[i].area-mid)*(a[i].area-mid))*a[i].bumanyi;
    24     }
    25     return t;
    26 }
    27 int main()
    28 {
    29     double mid,mmid,left,right,t1,t2;
    30     int t,i,w=0;
    31     scanf("%d",&t);
    32     while(t--)
    33     {
    34         w++;
    35         scanf("%d",&n);
    36         for(i=0;i<n;i++)
    37             scanf("%lf %lf",&a[i].area,&a[i].bumanyi);
    38         sort(a,a+n,comp1);
    39         left=a[0].area;right=a[n-1].area;
    40         while(right-left>1e-4)//因为结果取整,精度不要太大,会超时的
    41         {
    42             mid=left/2+right/2;
    43             mmid=mid/2+right/2;
    44             t1=dis(mid);
    45             t2=dis(mmid);
    46             if(t1>t2)
    47                 left=mid;
    48             else if(t1<t2)
    49                 right=mmid;
    50             else
    51                 break;
    52 
    53         }
    54         printf("Case #%d: %.lf
    ",w,t1);
    55     }
    56     return 0;
    57 }

    Squares POJ2002

    算法过程:

    1 将顶点按x坐标递增排序,若x相同,按y坐标递增排序,然后枚举所有边,对每一条由点p1和p2(根据排序p1 < p2)组成的边按照如下方式可唯一确定一个正方形:

        1) 将边绕p1逆时针旋转90度得到点p3

        2) 将边绕p2顺时针旋转90度得到点p4

    则p1 p2 p3 p4组成一个正方形,设p1 = (x1,y1), p2 = (x2, y2),根据向量的旋转公式可以求出p3, p4的坐标为

    p3 = (y1 - y2 + x1, x2 - x1 + y1)

    p4 = (y1 - y2 + x2, x2 - x1 + y2)

    2 然后搜索点p3和p4是否存在,若存在则找到一个正方形,计数加1,可以发现总是存在两条边确定的正方形是一样的,也就是说每个正方形会被发现2次,所以要将最后的计数结果除以2.

    实现的时候关键是如何搜索某个点是否存在,由于所有点都排序过,所以可以用二分查找来搜索,但速度比较慢,至少1000ms, hash的速度更快些,可以达到几百ms,还有hash表如果用开放地址线性探测法解决冲突的话,很容易超时,

    而用链地址法解决冲突效果要好很多。下面是二分搜索和hash两种方法的代码实现。

    貌似那些会超时的程序可以用二分法或三分法来压缩时间(个人猜测!!)

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 using namespace std;
     5 int n;
     6 struct line
     7 {
     8     int x;
     9     int y;
    10 }a[1005];
    11 bool comp1(line i,line j)
    12 {
    13     if(i.x<j.x)
    14         return true;
    15     else if(i.x==j.x)
    16     {
    17         if(i.y<j.y)
    18             return true;
    19     }
    20     return false;
    21 }
    22 int chazhao(int i,int j)
    23 {
    24     int left,right,mid;
    25     left=0;
    26     right=n-1;
    27     while(left<=right)
    28     {
    29         mid=(left+right)/2;
    30         if(i==a[mid].x&&j==a[mid].y)
    31             return 1;
    32         else if(i<a[mid].x||(i==a[mid].x&&j<a[mid].y))
    33             right=mid-1;
    34         else
    35             left=mid+1;
    36     }
    37     return 0;
    38 }
    39 int main()
    40 {
    41     int sum,i,j,x,y;
    42     while(scanf("%d",&n)!=EOF)
    43     {
    44         if(n==0)
    45             break;
    46         sum=0;
    47         for(i=0;i<n;i++)
    48             scanf("%d %d",&a[i].x,&a[i].y);
    49         sort(a,a+n,comp1);//排序
    50         for(i=0;i<n;i++)
    51             for(j=i+1;j<n;j++)
    52         {
    53             x=a[i].y-a[j].y+a[i].x;
    54             y=a[j].x-a[i].x+a[i].y;
    55             if(chazhao(x,y)==0)
    56                 continue;
    57             x=a[i].y-a[j].y+a[j].x;
    58             y=a[j].x-a[i].x+a[j].y;
    59             if(chazhao(x,y))
    60                 sum++;
    61         }
    62         printf("%d
    ",sum/2);
    63     }
    64     return 0;
    65 }//从前俩个点来判断第三第四个点是否存在
  • 相关阅读:
    【Linux】5.5 Shell运算符
    【Linux】5.4 Shell数组
    【Linux】5.3 Shell字符串
    【Linux】5.2 Shell变量
    【Linux】5.1 Shell简介
    【Linux】3.11 包管理工具(RPM和YUM)
    【Linux】3.10 进程管理(重点)
    【Linux】3.9 网络配置
    【Linux】3.8 Linux磁盘分区、挂载
    【Linux】3.7 定时任务调度
  • 原文地址:https://www.cnblogs.com/tt123/p/3228086.html
Copyright © 2011-2022 走看看