鱼C论坛

 找回密码
 立即注册
查看: 1150|回复: 8

[已解决]美丽几何

[复制链接]
发表于 2020-12-23 10:57:37 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 727181660 于 2020-12-26 19:42 编辑

在平面上有n个点,初始每个点的美丽值都为0,任意选择两个点组成一条
直线,对于每一条直线,如果存在一个点,这个点到这条直线的距离小于其他
n-3个点到这条直线的距离,那么我们把这个点的美丽值加1。为了简化输出,
我们只需要输出所有点的美丽值的异或值,保证三点不共线。
输入说明
第一行一个正整数n(4<=n<=2000)
接下来n行,每一行有2个正整数x,y。代表一个点的坐标(0<=x,y<=100000000)
输出说明
输出所有点的美丽值的异或值。
输入样例
4
00
01
10
11
4
00
10
12
21
输出样例
0
3
最佳答案
2020-12-24 13:17:40
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
typedef pair<int,int> PII;
const int N=2005;
int n,ml[N],res;
double A,B,C;
PII pa[N];
bool b[N];

void line(PII a,PII b){
        if(a.first==b.first){
                A=1,B=0,C=-a.first;
                return;
        }
        A=(b.second-a.second)/(b.first-a.first);
        C=a.second-A*a.first;
        A=-A,C=-C,B=1;
}

inline double distance(PII a){
        return fabs(A*a.first+B*a.second+C)/sqrt(A*A+B*B);
}

int func(){
        double dis;
        bool is_min=true;
        for(int i=0;i<n;i++){
                b[i]=true;
                for(int j=i+1;j<n;j++){
                        b[j]=true;
                        line(pa[i],pa[j]);
                        for(int m=0;m<n;m++){
                                if(!b[m]){
                                        b[m]=true;
                                        is_min=true;
                                        dis=distance(pa[m]);
                                        for(int k=0;k<n;k++){
                                                if(!b[k]&&distance(pa[k])<=dis){
                                                        is_min=false;
                                                        break;
                                                }
                                        }
                                        if(is_min)
                                                ml[m]++;
                                        b[m]=false;
                                }
                        }
                        b[j]=false;
                }
                b[i]=false;
        }
}
int main(){
        int a,b;
        scanf("%d",&n);
        for(int i=0;i<n;i++){
                scanf("%d%d",&a,&b);
                pa[i]={a,b};
        }
        func();
        for(int i=0;i<n;i++)
                res^=ml[i];
        printf("%d",res);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-23 11:17:41 From FishC Mobile | 显示全部楼层
求救求救!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-23 11:50:55 | 显示全部楼层
等大佬吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 15:51:40 From FishC Mobile | 显示全部楼层
来人啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 17:23:03 From FishC Mobile | 显示全部楼层
大哥大姐们救救孩子吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-24 00:25:59 From FishC Mobile | 显示全部楼层
来个大佬救救我呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-24 13:17:40 | 显示全部楼层    本楼为最佳答案   
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
typedef pair<int,int> PII;
const int N=2005;
int n,ml[N],res;
double A,B,C;
PII pa[N];
bool b[N];

void line(PII a,PII b){
        if(a.first==b.first){
                A=1,B=0,C=-a.first;
                return;
        }
        A=(b.second-a.second)/(b.first-a.first);
        C=a.second-A*a.first;
        A=-A,C=-C,B=1;
}

inline double distance(PII a){
        return fabs(A*a.first+B*a.second+C)/sqrt(A*A+B*B);
}

int func(){
        double dis;
        bool is_min=true;
        for(int i=0;i<n;i++){
                b[i]=true;
                for(int j=i+1;j<n;j++){
                        b[j]=true;
                        line(pa[i],pa[j]);
                        for(int m=0;m<n;m++){
                                if(!b[m]){
                                        b[m]=true;
                                        is_min=true;
                                        dis=distance(pa[m]);
                                        for(int k=0;k<n;k++){
                                                if(!b[k]&&distance(pa[k])<=dis){
                                                        is_min=false;
                                                        break;
                                                }
                                        }
                                        if(is_min)
                                                ml[m]++;
                                        b[m]=false;
                                }
                        }
                        b[j]=false;
                }
                b[i]=false;
        }
}
int main(){
        int a,b;
        scanf("%d",&n);
        for(int i=0;i<n;i++){
                scanf("%d%d",&a,&b);
                pa[i]={a,b};
        }
        func();
        for(int i=0;i<n;i++)
                res^=ml[i];
        printf("%d",res);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-26 19:41:56 From FishC Mobile | 显示全部楼层
求根据大神的解题给出解题思路解法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-26 19:49:31 From FishC Mobile | 显示全部楼层
玛了个巴卡 发表于 2020-12-24 13:17

大哥能不能给一些解题思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 06:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表