1.题目描述:点击打开链接
2.解题思路:本题是一道简单的找最大值问题。只需要找出完全相同的行中个数那一行即可,输出它的个数。由于给定的范围比较小,可以直接用O(N^3)的算法解决。查找的时候用一个mark数组来标记哪些行已经查找过了,这样可以避免重复查找。
3.代码:
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<string> #include<sstream> #include<set> #include<vector> #include<stack> #include<map> #include<queue> #include<deque> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<functional> using namespace std; typedef long long ll; typedef unsigned long long ull; #define me(s) memset(s,0,sizeof(s)) #define For(i,n) for(int i=0;i<(n);i++) #define pb push_back #define sz size #define clr clear #define F(a,b) for(int i=a;b;i++) int n; const int N=110; int vis[N][N]; int main() { while(~scanf("%d",&n)) { for(int i=0;i<n;i++) { char s[N]; scanf("%s",s); for(int j=0;j<n;j++) vis[i][j]=s[j]-'0'; } int mark[N]; int cnt=0; me(mark); int maxl=0;//维护找到的相同行的最大值 for(int i=0;i<n;i++)//枚举每一行 if(!mark[i]) { mark[i]=++cnt;//mark[i]表示第i行是第mark[i]种不同的行 int num=1;//统计和第i行完全相同的行的个数 for(int j=i+1;j<n;j++) { int flag=1; for(int k=0;k<n;k++) if(vis[j][k]!=vis[i][k]) { flag=0;break; } if(flag) { mark[j]=cnt;num++; } } maxl=max(maxl,num);//更新最大值 } printf("%d\n",maxl); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-29 19:10:28