题目大意:
给出n*n 的矩阵,选出不同行不同列的n个元素,并求和;
如果所有选法所产生的和相等,则输出 homogeneous
否则输出not homogeneous
正常来说题有n!中情况,如果全部计算出来会tle
这里其实只需要哦O(n*n)的复杂度就可以算出~
我们并不一定要算出所有的情况~
先来(1,1)(2,2)(3,3)(4,4)和(1,2)(2,1)(3,3)(4,4)这两种情况~
第二种情况是由上一种改变了一次所变化而来~
即把(1,1)(1,2)(2,1)(2,2)这四个点组成的小正方形对角线相互交换~
所以只要每次交换最小最小的正方形的对角线并判断即可~
| ① | ② | |
| ③ | ④ | |
| ⑤ | ⑥ |
那么来考虑这种情况
| x | ||
| x | ||
| x |
x表示选择了这些个点进行加和~
| x | ||
| x | ||
| x |
那么假设两两小正方形的对角线和相等~
则 ①+④=②+③
③+⑥=④+⑤
两式相加得①+⑥+④+③=②+⑤+④+③
两边消去得①+⑥=②+⑤
所以上述消去证明了只要每个小正方形的对角线和相等~就能证明结论成立
#include"stdio.h"
int n;
int a[1001][1001];
int t;
int main()
{
int i,j;
while(~scanf("%d",&n)&&n)
{
t=1;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
scanf("%d",&a[i][j]);
for(i=1;t&&i<n;i++)
for(j=1;t&&j<n;j++)
if(a[i][j]+a[i+1][j+1]!=a[i][j+1]+a[i+1][j])
t=0;
if(t)
puts("homogeneous");
else
puts("not homogeneous");
}
return 0;
}
本文探讨了如何从n*n矩阵中选取不同行不同列的n个元素,并判断其和值是否相等,通过特定的交换操作简化计算过程。
314

被折叠的 条评论
为什么被折叠?



