BNUEP1201 PKU2941 Homogeneous Squares
题目大意:
一个N×N的数字矩阵, 若在矩阵中任意取N个数字,每个数字的行列互不相同,其和都是一个定值,则该矩阵是"Homogeneous"的,否则是"Not Homogeneous"。N<=1000
分析:
除了随机算法,没有想到更好的方法……
判断一个矩阵是否是Homogeneous,则在矩阵中随机选取n个独立的点求和。
重复m次,若每次得到的和都相等,则认为矩阵是Homogeneous的;否则只要有一个不相等,则是Not Homogeneous。
似乎这个题目的数据超级强,随机算法正确的概率不尽人意。
我把重复次数m从n增加到4n才勉强通过,m取n时在本机测试几乎没有一次能完全正确……
这样随机用了2.5s左右,很危险。PKU上很多人在0.5s以内就过了,应该有直接一些的算法。
逼不得已的时候还是不要用随机的好,要不比赛的时候罚时可够受的了……
=====================================================
/* PKU2941 Homogeneous Squares */ #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 1001
int a[N][N];
int b[N],t;
int getSum(int n){
int i,m=0;
for(i=0;i<n;i++)
m+=a[i][b[i]];
return m;
}
void change(int *x,int *y){
t=*x;*x=*y;*y=t;
}
int main()
{
int i,j,k,m,n;
int sum,s,x,y;
int flag;
srand(time(NULL));
while(scanf("%d",&n),n){
//input
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
//init
for(i=0;i<n;i++) b[i]=n-i-1;
sum=getSum(n);
//random
flag=1;
m=n*4;
for(k=0;k<m&&flag;k++){
//change
for(i=0;i<n;i+=2){
j=rand()%n;
change(&b[i],&b[j]);
}
//judge
s=getSum(n);
if(s!=sum) flag=0;
}
//output
if(flag) puts("homogeneous");
else puts("not homogeneous");
}
return 0;
}