zoukankan      html  css  js  c++  java
  • poj 1408

    题目http://poj.org/problem?id=1408

     题意:在x轴,x = 1,y轴,y = 1.这四条线段上给出一些点,然后把x轴上的点和x = 1 上的点一一对应连接,把y轴上的点和y = 1上的点也一一对应连接,在这些连接线组成的四边形(除了定点外,不含其它的点)中,找出一个面积最大的

    思路:求出所有的交点,然后求每一个四边形面积,找出最大输出即可,纠结了很久都不出结果,就是因为一个点保存的时候x写成了y,真杯具。

    View Code
      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <math.h>
      4 #include <stdlib.h>
      5 #include <iostream>
      6 #define N 2000
      7 
      8 using namespace std;
      9 
     10 struct node
     11 {
     12     double x;
     13     double y;
     14 };
     15 int n;
     16 node sx[N][2];
     17 node zy[N][2];
     18 node point[N][N];
     19 void init()
     20 {
     21     int i;
     22     point[0][0].x = point[0][0].y = point[n + 1][0].y = point[0][n + 1].x = 0;
     23     point[n + 1][0].x = point[0][n + 1].y = point[n + 1][n + 1].x = point[n + 1][n + 1].y = 1; // ******
     24     for(i = 1;i <= n; i++)
     25     {
     26         scanf("%lf",&sx[i][0].x);
     27         sx[i][0].y = 0;
     28     }
     29     for(i = 1;i <= n; i++)
     30     {
     31         scanf("%lf",&sx[i][1].x);
     32         sx[i][1].y = 1;
     33     }
     34     for(i = 1;i <= n; i++)
     35     {
     36         scanf("%lf",&zy[i][0].y);
     37         zy[i][0].x = 0;
     38     }
     39     for(i = 1;i <= n; i++)
     40     {
     41         scanf("%lf",&zy[i][1].y);
     42         zy[i][1].x = 1;
     43     }
     44     for(i = 1;i <= n; i++)
     45     {
     46         point[i][0] = sx[i][0];
     47         point[i][n + 1] = sx[i][1];
     48         point[0][i] = zy[i][0];
     49         point[n + 1][i] = zy[i][1];
     50     }
     51 }
     52 node jiaodian(node a1,node a2,node a3,node a4)  // 四种情况求交点
     53 {
     54     node p;
     55     double k1,k2,b1,b2;
     56     if(a1.x == a2.x)
     57     {
     58         if(a3.y == a4.y)
     59         {
     60             p.x = a1.x;p.y = a3.y;
     61         }
     62         else
     63         {
     64             k1 = a4.y - a3.y;
     65             p.x = a1.x;
     66             p.y = (k1 * p.x) + a3.y;
     67         }
     68     }
     69     else
     70     {
     71         k1 = 1 * 1.0 / (a2.x - a1.x);
     72         b1 = -1 * k1 * a1.x;
     73         if(a3.y == a4.y)
     74         {
     75             p.y = a3.y;
     76             p.x = (p.y - b1) / k1;
     77         }
     78         else
     79         {
     80             k2 = a4.y - a3.y;
     81             b2 = a3.y;
     82             p.x = (b2 - b1) * 1.0 / (k1 - k2);
     83             p.y = k2 * p.x + b2;
     84         }
     85     }
     86     //cout<<"P"<<p.x<<" "<<p.y<<endl<<endl;
     87     return p;
     88 }
     89 double qmianji(node a1,node a2,node a3,node a4) // 叉积求多边形面积
     90 {
     91     node temp[10];                        // 参考链接http://blog.csdn.net/hbzjklqh/article/details/6707819
     92     temp[0] = a1;
     93     temp[1] = a2;
     94     temp[2] = a3;
     95     temp[3] = a4;
     96     int i;
     97     double kemp = 0,cemp = 0;
     98     double s;
     99     for(i = 0;i < 4; i++)
    100     {
    101         kemp += temp[i].x * temp[(i + 1) % 4].y;
    102         cemp += temp[i].y * temp[(i + 1) % 4].x;
    103     }
    104     //cout<<kemp<<" "<<cemp<<endl;
    105     s = fabs(kemp - cemp) / 2;
    106     //cout<<s<<endl;
    107     return s;
    108 }
    109 int main()
    110 {
    111     int i,j;
    112     double mianji[N];
    113     freopen("data.txt","r",stdin);
    114     while(cin>>n,n)
    115     {
    116         memset(mianji,0,sizeof(mianji));
    117         init();
    118         for(i = 1; i <= n; i++)
    119         {
    120             for(j = 1; j <= n; j++)
    121             {
    122                 point[i][j] = jiaodian(sx[i][0],sx[i][1],zy[j][0],zy[j][1]);
    123             }
    124         }
    125         double maxx = 0;
    126         int k = 0;
    127         for(i = 0; i <= n; i++)
    128         {
    129             for(j = 0; j <= n; j++)
    130             {
    131                 mianji[k++] = qmianji(point[i][j],point[i + 1][j],point[i + 1][j + 1],point[i][j + 1]);
    132             }
    133         }
    134         for(i = 0; i <= (n + 1) * (n + 1) ; i++)
    135         {
    136             if(maxx < mianji[i]) maxx = mianji[i];
    137         }
    138         printf("%.6lf\n",maxx);
    139     }
    140     return 0;
    141 }
  • 相关阅读:
    用vue前后端分离项目开发记录
    使用 JavaScript 将网站后台的数据变化实时更新到前端
    怎么使用 JavaScript 将网站后台的数据变化实时更新到前端
    修改el-table滚动条样式
    修改浏览器滚动条样式
    查找和替换img src
    cookie添加删除修改
    如何处理CSS3属性前缀
    PostCSS深入学习: PostCSS和Sass、Stylus或LESS一起使用
    在 CSS 预编译器之后:PostCSS
  • 原文地址:https://www.cnblogs.com/fxh19911107/p/2481969.html
Copyright © 2011-2022 走看看