郁闷的记者(枚举)

3.郁闷的记者

(rank.pas/c/cpp)

【题目描述】

你是一个体育报社的记者,你接受到一个艰难的任务:有N支足球队参加足球比赛,现在给你一些比赛的结果,需要你给出各支球队的排名,从1N

以下是给你的一些信息:

(1)    没有平局;

(2)    不同的球队排名不能相同;

(3)    对于所有满足1<=a<b<=n,第a名的球队一定可以打败第b名的球队。

给你部分比赛结果,要求给出排名,并且判断是否存在另一种排名方法满足给你的比赛结果。

【输入格式】

第一行输入N(1<=N<=5000),表示球队的数量,编号为1N。第二行输入M(1<=M<=100,000),表示给出的比赛场数,接下来M行,每行两个整数X_i,Y_i,表示X_i能打败Y_i

【输出格式】

    输出包含N+1行,前N行描述球队的排名,第i个数表示第i名的球队,第N+1行包含一个整数,如果为0表示不存在其他的排名方法,否则为1表示还有其他的排名方法。

【样例输入输出】

Rank.in

Rank.out

4

5

1 2

3 1

3 2

3 4

4 1

3

4

1

2

0

3

2

2 1

2 3

2

1

3

1

【数据范围】

30%的数据 1<=N<=7,1<=M<=15

60%的数据1<=N<=100,1<=M<=2000

 

 

 

 

分析:

 

 

枚举两个两个点(X1,Y1)(X2,Y2), 从图中可以看出两个绿色线段和两个蓝色线段分别相等,所以有以下两个方程:

X2-X1=Y3-Y1óY3=Y1+(X2-X1)

Y2-Y1=X1-X3óX3=X1-(Y2-Y1)

(x3,y3)求出后,可以根据同样的方法求出(Y4,Y4),也可以利用平行四边形两条对角线相交于一点得出:

X1+X4=X2+X3

Y1+Y4=Y2+Y3

从而求出(X4,Y4),再判断(X3,Y3)(X4,Y4)是否存在就可以了

时间复杂度为O(N^2)

 

 

再次贴代码:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
#include<stdio.h>
#include
<stdlib.h>
#include
<math.h>
int i,j,xx,yy,x3,y3,x4,y4;
int x[3010],y[3010],g[5010][5010],n;
long max;
int main(){
    freopen(
"ruin.in","r",stdin);
    freopen(
"ruin.out","w",stdout);
    scanf(
"%d",&n);
    
for (i=1;i<=n;i++){
        scanf(
"%d%d",&x[i],&y[i]);
        g[x[i]][y[i]]
=1;
    }
    
for (i=1;i<n;i++)
        
for (j=i+1;j<=n;j++){
            xx
=x[j]-x[i];
            yy
=y[j]-y[i];
            x3
=x[i]-yy;
            y3
=y[i]+xx;
            x4
=xx+x3;
            y4
=yy+y3;
            
if (x3<0 || y3<0 || x4<0 || y4<0 || x3>5000 || y3>5000 || x4>5000 || y4>5000continue;
            
if (g[x3][y3]==1 && g[x4][y4]==1){
                
if (xx*xx+yy*yy>max)
                    max
=xx*xx+yy*yy;
            }
            x3
=x[i]-yy;
            y3
=y[i]-xx;
            x4
=xx+x3;
            y4
=yy+y3;
            
if (x3<0 || y3<0 || x4<0 || y4<0 || x3>5000 || y3>5000 || x4>5000 || y4>5000continue;
            
if (g[x3][y3]==1 && g[x4][y4]==1){
                
if (xx*xx+yy*yy>max)
                    max
=xx*xx+yy*yy; 
            }            
        }
    
    printf(
"%ld",max);
    
    
return 0;
}

 

 

转载于:https://www.cnblogs.com/yanrui7098/archive/2009/11/18/1605598.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值