题意:给定一个由n*n块地砖铺成的房间,每块砖用0表示未打扫,1表示已打扫。要求每次打扫只能扫一整列地砖,对于其中的地砖未打扫的会变为已打扫,已打扫的会变为未打扫。即1会变成0,而0会变成1,求一种打扫方案,使得打扫完后整行地砖均为已打扫的行数最大。
首先,可以看出,如果两行地砖状态完全相同,那么无论如何打扫,这两行地砖的状态始终都是完全相同的(因为打扫的时候必须打扫整列)。倒过来想,假设打扫完后某些行的地砖处于整行为1,那么打扫之前这些行的对应列的地砖状态也是完全相同的。那么既然我们要使最后整行为1的行数最大,实际上就是求开始时整行地砖处于相同状态的行数最大。将整行看做一个字符串,直接用map实现。记录出现次数最多的字符串。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
using namespace std;
int main()
{
int n;
char s[105];
map <string, int> cnt;
while(scanf("%d", &n) != EOF)
{
cnt.clear();
int ans = 0;
while(n--)
{
scanf("%s", s);
ans = max(ans, ++cnt[s]);
}
printf("%d\n", ans);
}
return 0;
}
本文探讨了一种通过分析地砖初始状态来最大化已打扫行数的算法。该算法利用map记录每一行作为字符串时的出现频率,最终找出频率最高的状态以确定最优打扫方案。
740

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



