3.郁闷的记者
(rank.pas/c/cpp)
【题目描述】
你是一个体育报社的记者,你接受到一个艰难的任务:有N支足球队参加足球比赛,现在给你一些比赛的结果,需要你给出各支球队的排名,从1到N。
以下是给你的一些信息:
(1) 没有平局;
(2) 不同的球队排名不能相同;
(3) 对于所有满足1<=a,第a名的球队一定可以打败第b名的球队。
给你部分比赛结果,要求给出排名,并且判断是否存在另一种排名方法满足给你的比赛结果。
【输入格式】
第一行输入N(1<=N<=5000),表示球队的数量,编号为1到N。第二行输入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)
再次贴代码:
#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>5000) continue;
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>5000) continue;
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;
}