p1954

说起来,齿轮明明是一块转动的.

这道题概括了数论和图论,是一道很好的水题.

先用一个结构体存一下位置,如果遇见了xi==0&&yi==0的记录一下,它是第一个齿轮.看到n<=1080(好奇怪的数),就直接n^2两两比较齿轮连不连,同时sum[i]++,sum[f]++.最后sum[i]表示第i个齿轮所连的齿轮数量.

所有的齿轮都是连在一起的,看到除了第一个齿轮,其他齿轮都是被一个齿轮带动的,也就是说图画出来是一个链,大部分sum都等于2.唯一不一样的就是第一个和最后一个.用n的时间跑一遍,看谁的sum==1且不是第一个齿轮就输出就好.

 

using namespace std;
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int i,f,tx,ty,tr;
int n;
int top,sum[1100];
struct node
{
    int x,y,next,r,v;
}o[1100];
int main()
{
    n=read();
    for(i=1;i<=n;i++)
    {
        o[i].x=read();
        o[i].y=read();
        o[i].r=read();
        if(o[i].x==0&&o[i].y==0)
            top=i;
    }
    for(i=1;i<=n;i++)
    {
        for(f=i+1;f<=n;f++)
        {
            tx=o[i].x-o[f].x;
            ty=o[i].y-o[f].y;
            tr=o[i].r+o[f].r;
            if(tx*tx+ty*ty==tr*tr)
                sum[i]++,sum[f]++;
            
        }
    }
    for(i=1;i<=n;i++)
        if(sum[i]==1&&i!=top)
            cout<<o[i].x<<' '<<o[i].y,exit(0);
        
}

 

posted @ 2018-09-19 13:50  zzuqy  阅读(113)  评论(0编辑  收藏  举报