PKU2941 Homogeneous Squares - 随机算法

来源:互联网 发布:淘宝卖干货要什么条件 编辑:程序博客网 时间:2024/06/11 21:56

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;
}