CodeForces 554B()

 

CodeForces 554B

Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u

Description

Ohana Matsumae is trying to clean a room, which is divided up into an n by n grid of squares. Each square is initially either clean or dirty. Ohana can sweep her broom over columns of the grid. Her broom is very strange: if she sweeps over a clean square, it will become dirty, and if she sweeps over a dirty square, it will become clean. She wants to sweep some columns of the room to maximize the number of rows that are completely clean. It is not allowed to sweep over the part of the column, Ohana can only sweep the whole column.

Return the maximum number of rows that she can make completely clean.

Input

The first line of input will be a single integer n (1 ≤ n ≤ 100).

The next n lines will describe the state of the room. The i-th line will contain a binary string with n characters denoting the state of the i-th row of the room. The j-th character on this line is ‘1‘ if the j-th square in the i-th row is clean, and ‘0‘ if it is dirty.

Output

The output should be a single line containing an integer equal to a maximum possible number of rows that are completely clean.

Sample Input

Input

40101100011110101

Output

2

Input

3111111111

Output

3

题解:给定一个由n*n块地砖铺成的房间,每块砖用0表示未打扫,1表示已打扫。要求每次打扫只能扫一整列地砖,对于其中的地砖未打扫的会变为已打扫,已打扫的会变为未打扫。即1会变成0,而0会变成1,求一种打扫方案,使得打扫完后整行地砖均为已打扫的行数最大。

看似无解,实则有解,其实很简单。。

首先,可以看出,如果两行地砖状态完全相同,那么无论如何打扫,这两行地砖的状态始终都是完全相同的(因为打扫的时候必须打扫整列)。倒过来想,假设打扫完后某些行的地砖处于整行为1,那么打扫之前这些行的对应列的地砖状态也是完全相同的。那么既然我们要使最后整行为1的行数最大,实际上就是求开始时整行地砖处于相同状态的行数最大。将整行看做一个字符串,直接用map实现。记录出现次数最多的字符串。


#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
char a[102][102];
int max(int x,int y)
{
if (x<y)
  return y;
 else
  return x;
}
int main()
{
    int n,i,j,k = 0;
    scanf("%d",&n);
    for(i = 1;i<=n;i++)
    {
        scanf("%s",a[i]);
    }
    for(i=1;i<=n;i++)
    {
        int s=0;
        for(j=1;j<=n;j++)
        {
            if(strcmp(a[i],a[j])==0) //比较两个数组
                s++;
        }
        k = max(k,s);
    }
    printf("%d\n",k);
	return 0;
}  
时间: 2024-10-10 10:46:19

CodeForces 554B()的相关文章

codeforces 51C(Three Base Stations)

[题意描述] 在高速公路的两旁有很多房子,每个房子有自己的坐标,现在给定三个基站,每个基站都有相应的覆盖半径d,现在要使基站覆盖所有的房子,问基站应该如何建,并且最小的覆盖半径是多少? [解题思路] 我们可以对基站的覆盖半径进行二分,二分的左区间端点l是0,右区间端点r是c[n]-c[1]即所有房子所占据的范围.这样就可以把基站半径算出来了,求基站的坐标时有点小技巧,看看下面的代码就知道了. [AC代码] 1 #include<iostream> 2 #include<cstdio>

codeforces 165B(Burning Midnight Oil)

[题意描述] 本题就是给定代码任务为n行,起始代码书写能力为v行,然后每经过一次除以k,当v变为0时看是否完成代码任务n?并求出最小的v. [解题思路] 我们可以对v值进行二分,然后确定最后的v值. [AC代码] 1 #include<iostream> 2 using namespace std; 3 int ok(int v,int k) 4 { 5 int sum=v; 6 while(v!=0) 7 { 8 sum+=v/k; 9 v/=k; 10 } 11 return sum; 1

CodeForces 424D: ...(二分)

题意:给出一个n*m的矩阵,内有一些数字.当你从一个方格走到另一个方格时,按这两个方格数字的大小,有(升,平,降)三种费用.你需要在矩阵中找到边长大于2的一个矩形,使得按这个矩形顺时针行走一圈的费用,与给定费用最接近.3<=n,m<=300. 思路:O(1)计算一个矩形的费用不是什么难事,因为考虑到有前缀性质(前缀性质:[l,r] = [0,r] - [0,l-1]),只要预处理好各行各个方向行走的费用,就容易计算. 直接枚举容易得到O(n^4)的算法.难以过.这时就应当想到优化.实际上,经过

CodeForces 141E: ...(最小生成树)

[条件转换] 两两之间有且只有一条简单路径<==>树 题意:一个图中有两种边,求一棵生成树,使得这棵树中的两种边数量相等. 思路: 可以证明,当边的权是0或1时,可以生成最小生成树到最大生成树之间的任意值的生成树. 那么,方法就是生成最小生成树,然后,尽量替换0边,使得其成为值为(n-1)/2的生成树. 代码: 写的很乱,没有条理.还是应当先写出流程伪码后再敲代码的. #include <cstdio> #include <cstring> #include <v

Codeforces 444C(线段树)

区间颜色不一致就更新到底,否则lazy标记 #include<cstdio> #include<cstring> #include<cmath> #include<queue> using namespace std; #define lc l,m,index<<1 #define rc m+1,r,index<<1|1 #define N 100005 #define ll __int64 struct node { bool sa

CodeForces 451B (翻转一次递减子序列得到递增序列) 简单题

题目大意:判断能否找到递减的子列,将其翻转后得到的整个数列递增,只能找一次,最后输出,如果能还要输出翻转的首尾位 置,注意数数组下标,不是首尾的数,当然如果本来数列就递增,就随便找个数翻一下. 我的方法是直接模拟,直接从a[0]开始寻找递减序列,然后判断递减序列翻转后能否构成递增序列. #include<stdio.h> int n,a[100005]; int main() { int i,j,h; bool bo=true; scanf("%d",&n); fo

CodeForces 86D(Yandex.Algorithm 2011 Round 2)

思路:莫队算法,离线操作,将所有询问的左端点进行分块(分成sqrt(n) 块每块sqrt(n)个),用左端点的块号进行排序小的在前,块号相等的,右端点小的在前面. 这样要是两个相邻的查询在同一块内左端点每次最多移动sqrt(n) n次的话效率为nsqrt(n) ,对于同一块内右端点为有序的那么最多移动 n次  .总的效率为nsqrt(n) . 要是相邻的查询不同块 最坏效率为O(n) 因为块最多为sqrt(n)个那么坏效率也为nsqrt(n).   总的效率就为nsqrt(n) #include

CodeForces - 589A(字符串处理)

题目链接:http://codeforces.com/problemset/problem/589/A 题目大意:给定n个邮件地址,任何电子邮件地址都将显示为"login @ domain",其中: 1.a"login"是一个由非空的小写和大写字母序列以及点('.')和加号('+')组成的序列,从字母开始;2.a"domain"是一个由非空的小写和大写字母和点组成的序列,因为点将序列分成非空单词,仅由字母组成(即"domain"

Minimax Problem CodeForces - 1288D(二分+状态压缩)

题目链接:http://codeforces.com/problemset/problem/1288/D D. Minimax Problem time limit per test 5 seconds memory limit per test 512 megabytes input standard input output standard output You are given $$$n$$$ arrays $$$a_1$$$, $$$a_2$$$, ..., $$$a_n$$$; e