acm小学弟
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 925 Accepted Submission(s) : 134
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
今天小学弟又训练完了,但是小学弟又不想看球赛,于是小学弟看马赛了。他发现马鞍是一个奇怪的东西。于是小学弟根据马鞍定义了一种马鞍数:在一个二位矩阵中,马鞍数在当前行是最小的,在当前列是最大的,并且这个数在当前行和列都是独一无二的。小学弟现在马上打开电脑写出了一个程序求出了矩阵里面马鞍数的数量。那么,你能求出来吗?这是一道非常简单的题目。
Input
输入包含多组,每一组输入一个n(1<=n<=1000),接下来n行,每一行有n个数a1,a2,a3……,an(0<=ai<=10000000000)。
Output
输出马鞍数的数量。
Sample Input
5 1 2 3 4 5 0 0 0 0 4 0 0 0 0 3 0 0 0 0 2 0 0 0 0 1
Sample Output
1
#include <iostream>
using namespace std;
int sum=0;
int flag=0;
int n;
long long map[1005][1005];
void find(int a,int b,int ans)
{
int k=0;
for(int i=0;i<n;i++)
{
if(map[i][b]==ans)
{
k++;
}
}
for(int j=0;j<n;j++)
{
if(map[a][j]==ans)
k++;
}
if(k>2)
return;
long long max1=0;
for(int i=0;i<n;i++)
{
if(map[i][b]>max1)
max1=map[i][b];
}
if(max1==ans)
flag=1;
}
int main()
{
while(cin>>n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>map[i][j];
val[i][j]=1;
}
}
long long max=0xFFFFFFFF;
int a,b;
sum=0;
for(int i=0;i<n;i++)
{
flag=0;
max=0xFFFFFFFF;
for(int j=0;j<n;j++)
{
if(map[i][j]<max)
{
max=map[i][j];
b=j;
a=i;
}
}
find(a,b,max);
if(flag==1)
{
sum++;
}
}
cout<<sum<<endl;
}
}
#include <iostream>
using namespace std;
int sum=0;
int flag=0;
int n;
long long map[1005][1005];
void find(int a,int b,int ans)
{
int k=0;
for(int i=0;i<n;i++)
{
if(map[i][b]==ans)
{
k++;
}
}
for(int j=0;j<n;j++)
{
if(map[a][j]==ans)
k++;
}
if(k>2)
return;
long long max1=0;
for(int i=0;i<n;i++)
{
if(map[i][b]>max1)
max1=map[i][b];
}
if(max1==ans)
flag=1;
}
int main()
{
while(cin>>n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>map[i][j];
val[i][j]=1;
}
}
long long max=0xFFFFFFFF;
int a,b;
sum=0;
for(int i=0;i<n;i++)
{
flag=0;
max=0xFFFFFFFF;
for(int j=0;j<n;j++)
{
if(map[i][j]<max)
{
max=map[i][j];
b=j;
a=i;
}
}
find(a,b,max);
if(flag==1)
{
sum++;
}
}
cout<<sum<<endl;
}
}