HDU 4353 枚举

简介:

题意:给出n个点,为商人要购买的点,m个点为金矿的位置。问如何使够买三个点或三个以上的点围成的多边形面积与多边形内金矿的数量的比值最小。

这题很容易想到比值最小的肯定是三角形和在三角形内的点的数量想比。虽然我没想到。然后很容易想到四重循环来找最小的比值但是会超时,所以需要预处理一下,先把两组点按照x轴排序,枚举两个n点,针对于每组点组成的线段选线段正上方的m点,存入数组中。然后再进行n^3循环枚举3个n内的点,长线段上的m点数-两条短线段的m点数的绝对值就是三角形内的点数。为什么是绝对值,因为长线短可能在上面,可能在线面,然后注意预处理时要注意区间的边界。828ms

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct point
{
    int x,y;
};
int cmp(point a,point b)
{
    return a.x<b.x;
}
int Direction(point pi,point pj,point pk) //判断向量PiPj在向量PiPk的顺逆时针方向 +顺-逆0共线
{
    return (pj.x-pi.x)*(pk.y-pi.y)-(pk.x-pi.x)*(pj.y-pi.y);
}
int yl[205][205];
point data[205],mine[505];
int main()
{
    int t,n,m,ca=0;
    scanf("%d",&t);
    while(t--)
    {
        memset(yl,0,sizeof(yl));
        scanf("%d%d",&n,&m);
        for(int i=0; i<n; i++)
            scanf("%d%d",&data[i].x,&data[i].y);
        for(int i=0; i<m; i++)
            scanf("%d%d",&mine[i].x,&mine[i].y);
        sort(mine,mine+m,cmp);
        sort(data,data+n,cmp);
        for(int i=0; i<n; i++)       //预处理
            for(int j=i+1; j<n; j++)
                for(int k=0; k<m&&mine[k].x<data[j].x; k++)
                    if(mine[k].x>=data[i].x&&Direction(data[i],data[j],mine[k])>0)
                        yl[i][j]++;
        double ans=-1;
        for(int i=0; i<n; i++)
            for(int j=i+1; j<n; j++)
                for(int k=j+1; k<n; k++)
                {
                    int q=yl[i][k]-yl[i][j]-yl[j][k];
                    if(q!=0)
                    {
                        double p=fabs((double)Direction(data[i],data[j],data[k])/(2.0*double(q)));
                        if(p<ans||ans==-1) ans=p;
                    }
                }
        printf("Case #%d: ",++ca);
        if(ans!=-1)
            printf("%.6f\n",ans);
        else
            puts("-1");
    }
    return 0;
}


目录
相关文章
|
4月前
【每日一题Day194】LC970强整数 | 枚举
【每日一题Day194】LC970强整数 | 枚举
33 0
|
3月前
【洛谷 P2089】烤鸡(循环枚举)
烤鸡问题探讨了如何组合10种配料达成特定美味程度。给定正整数$n$代表美味程度,程序需列出所有使得配料总和等于$n$的方案。样例输入11对应10种配料的不同组合,输出显示了10种符合条件的方案。代码通过暴力枚举实现,AC代码展示了如何遍历所有可能的配料质量组合来找到答案。对于100%的数据,$n\leq5000$。
28 0
|
3月前
【洛谷 P1618】三连击(升级版)题解(循环枚举+全排列)
该编程题目要求将数字1到9分为三组,形成三个三位数,使得这三个数成比例A:B:C。输入为A、B、C的值,输出符合条件的三位数组合,按首个数字升序排列。样例输入为1 2 3,输出多组解。代码使用全排列遍历数字,检查比例关系。若无解,则输出&quot;No!!!&quot;。
18 0
【AcWing】有效类型
4865. 有效类型 - AcWing题库
51 0
【AcWing】有效类型
codeforces144——D. Missile Silos(最短路+枚举)
codeforces144——D. Missile Silos(最短路+枚举)
87 0
codeforces144——D. Missile Silos(最短路+枚举)
|
算法 测试技术 C++
蓝桥杯第八讲--枚举与模拟【例题】(一)
蓝桥杯第八讲--枚举与模拟【例题】
127 0
蓝桥杯第八讲--枚举与模拟【例题】(一)
蓝桥杯第八讲--枚举与模拟【例题】(二)
蓝桥杯第八讲--枚举与模拟【例题】
149 0
蓝桥杯第八讲--枚举与模拟【例题】(二)
HDOJ/HDU 1015 Safecracker(枚举)
HDOJ/HDU 1015 Safecracker(枚举)
101 0
HDOJ(HDU) 1562 Guess the number(水题,枚举就行)
HDOJ(HDU) 1562 Guess the number(水题,枚举就行)
113 0