巨人与鬼

随便写了写不知道对不对……

2333333

主要:找到最下边最左边的点,与剩余的点形成角度,对角度排序,如果剩余点和最开始的点对应(巨人与鬼对应)则完成配对,否者,按照角度从小到大寻找,巨人与鬼个数一样则完成配对,进行下一轮……22222

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <stack>
#include <cctype>
#include <string>
#include <malloc.h>
#include <queue>
#include <map>

using namespace std;

const int INF = 0xffffff;
const double esp = 10e-8;
const double Pi = 4 * atan(1.0);
const int Maxn = 2000+10;
const long long mod =  2147483647;
const int dr[] = {1,0,-1,0,-1,1,-1,1};
const int dc[] = {0,1,0,-1,1,-1,-1,1};
typedef long long LL;

LL gac(LL a,LL b){
    return b?gac(b,a%b):a;
}

struct guest{
    double x,y,angle;
    int v;
    int num1;
    int num2;
    bool operator < (const guest a)const{
        if(abs(y-a.y) < esp)
            return x < a.x;
        return y < a.y;
    }
};

bool cmp(const guest a,const guest b){
    double x = a.angle;
    double y = b.angle;
   // cout << x << ‘ ‘ << y << ‘ ‘;
    if((x > 0 && y > 0) || (x < 0 && y < 0)|| (abs(x) < esp && y > 0)||(abs(y) <esp && x > 0)){
       // cout << (x < y) << endl;
        return (x < y);
    }
  //  cout << !(x < y) << ‘!‘ << endl;
    return !(x < y);
}

double get_angle(guest a,guest b){
    if(abs(a.y - b.y) < esp){
        if(b.x - a.x > 0) //不可能完全重合
            return 0;
        else
            return -1*esp*100;
    }
    if(abs(a.x - b.x) < esp)
        return 0xfffffff;
    return (a.y-b.y)/(a.x-b.x);
}

guest arr[1000];

void dis(int s,int e){
    if(e-s == 1){
        arr[s].num2 = arr[e].num1;
        arr[e].num2 = arr[s].num1;
        return;
    }
    sort(arr+s,arr+e+1);
    int sum = arr[s].v;
    for(int i = s+1;i <= e;i++){
        arr[i].angle = get_angle(arr[s],arr[i]);
    }
    sort(arr+s+1,arr+e+1,cmp);
    int t = s;
    while(sum){
        sum += arr[++t].v;
    }
    dis(s,t);
    dis(t+1,e);
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("inpt.txt","r",stdin);
#endif
    int n;
    while(~scanf("%d",&n)){
        for(int i = 0;i < n;i++){
            scanf("%d%lf%lf",&arr[i].num1,&arr[i].x,&arr[i].y);
            arr[i].v = 1;
            arr[i].num2 = 0;
        }
        for(int i = n;i < 2*n;i++){
            scanf("%d%lf%lf",&arr[i].num1,&arr[i].x,&arr[i].y);
            arr[i].v = -1;
            arr[i].num2 = 0;
        }
        dis(0,2*n-1);
        for(int i = 0;i < 2*n;i++){
            if(arr[i].v > 0){
                cout << arr[i].num1 << ‘ ‘ << arr[i].num2 << endl;
            }
        }
    }
    return 0;
}
时间: 2024-08-29 07:03:23

巨人与鬼的相关文章

UVaLive4043 UVa1411 Ants 巨人与鬼

题意:给出平面上n个白点n个黑点,要求两两配对,且配对所连线段没有交点. 法一:暴力 随机一个初始方案,枚举任意两条线段如果有交点就改一下. 效率其实挺好的. 法二:二分图最佳完美匹配 显然没有交点的方案是所有线段的长度和最小的方案,将边权构造为欧几里德距离即可,O(n4)的算法效率远不及法一,O(n3)与法一持平. 法三:分治 这是紫书上介绍的方法,每次找出一个最下最左的点,将其他的点相对于这个点进行极角排序,按极角序扫描,当白点和黑点一样多时(算上最下最左那个点),将第一个点和最后一个点配对

UVa 1411 Ants(分治)

https://vjudge.net/problem/UVA-1411 题意:n只蚂蚁和n颗苹果树,一一配对并且不能交叉. 思路:这就是巨人与鬼的问题.用分治法就行了. 1 #include<iostream> 2 #include<algorithm> 3 #include<set> 4 using namespace std; 5 6 int n; 7 const int maxn = 205; 8 9 int vis[maxn]; 10 11 struct nod

第八章 高效算法设计

分治法求最大连续和 注意范围是[x,y) #include<bits/stdc++.h> using namespace std; int maxsum(int *A,int x,int y){ if(y-x==1) return A[x]; int m=x+(y-x)/2; int maxs = max(maxsum(A,x,m),maxsum(A,m,y)); int v,L,R; v=0; L=A[m-1]; for(int i=m-1;i>=x;i--) L=max(L,v+=A

李逵频遇李鬼 “傍名牌”当遭痛击

品牌是市场竞争的有力武器,因而,无良商家傍名牌的现象在业界屡见不鲜,屡禁不止.近期,知名品牌"aigo""爱国者"被山寨,江西恒大高新指"恒大冰泉"商标侵权,再次使"李逵李鬼"成为公众热议话题.其实,孰真孰伪,迟早水落石出,但"李鬼"们一次次乱人耳目破坏市场,损害知名品牌.侵犯消费者利益的行为,是必须全面痛击.人人喊打了. 飞毛腿欲搭爱国者便车 近日,不少消费者发现通过国内某著名电商平台购买的所谓"

改变世界的科学巨人:费曼与罗宾逊

在历史上十分巧合的是,纳米技术与无穷小分析的基础概念都出现在1959年,两者都与"小"字有瓜葛(牵连). 1959年12月29日,理查德.费曼(Richard Feynman,1918-1988)在美国物理年会做主旨报告,题为"There's plenty of room at the botton"("实际上,存在巨大的空间"),副标题是"An Invitation to Enter a New Field of Physics&qu

浪潮之巅--蓝色巨人读后感

<浪潮之巅>--蓝色巨人读后感 论IT业的兴衰,不得不提BIM这个公司,它是IT业的常青树. 把握时机绝对是成功的第一步. 机械革命从三百年前开始到第二次世界大战结束,而IBM很幸运的干上了机械革命的最后一次浪潮,而且小托马斯华生成功把握机会领导IBM开始电子技术革命的浪潮.小华生把科学计算应用的了商业领域和人们的日常生活.无独有偶,比尔盖茨也是抓住与IBM合作的时机才有了走向成功的路子. 然而,有一个有远见且有智慧的领导者很重要.显然IBM很幸运. 众所周知IT领域的发展就是一波波的浪潮,而

android开发利器--站在巨人肩膀上前行

本文主要介绍有助于android开发的三方平台和网站. 一:开发阶段 1:SVN(一个开放源代码的版本控制系统) 团队开发没有服务器,代码管理就没那么方便了,推荐taocode阿里开源网站,方便团队开发,不用安装客户端,方便快捷. 2:服务器(一个管理资源并为用户提供服务的计算机) 团队开发初期,资金有限没服务器?阿里云免费使用6个月,新浪云也可助你一臂之力. 3:android论坛(在线答疑,资源共享,分享心得) 没有名师指路?EOE论坛追求提问没有0回复,解决问题好帮手;CSDN最大的中国I

计算机的巨人DELL的成功故事

戴尔(Michael Dell)是美国财星500大企业中,有史以来最年轻的公司总裁.他在1984年以一千美元创立戴尔公司.十五年后,成为美国第一大.全球第二大的个人计 算机公司及行销商,它的获利与成长更成为世界主要计算机厂商中的佼佼者.公司股票上市以来,涨幅超过百分之三万六千.一家公司在这么短的时间,创造如此不 凡的成就,希望藉由探讨戴尔公司的成功关键,对大家有所启发与帮助. 一.热情.梦想与机会:戴 尔从小就对可以计算东西的机器感到兴趣.就读大学一年级时,已藉由将计算机组装升级的技术开启创业之

站在巨人肩膀上——vb.net学习

jeecg v3.0入门视频 链接: http://pan.baidu.com/s/1bnrMfiJ密码: 8q0k MiniDao持久层 入门视频 链接: http://pan.baidu.com/s/1eQGc4W6 密码: stst JEECG-OnlineCoding<企业招聘系统> 视频 链接:http://pan.baidu.com/s/1sjHHVM9 密码: os7b JEECG公开课视频 链接: http://pan.baidu.com/s/1pJFeiiJ 密码: cr75