Yet Another Crosses Problem

http://icpc.upc.edu.cn/problem.php?cid=1803&pid=7

这道题就是给我们一堆符号,点就代表是白色,星号代表黑色。然后让我们判断黑色区域是否有十字形。
我的想法:
刚开始拿到这个题的时候,我的第一个思路就是,开一个二维字符数组,但是苦于数据规模太大,一开编译器就爆了;然后我有想过用结构体做,可是仍然需要很大的空间;最后在我们实验室的大佬的提示下,选择了用string类型做题。
算法思路:
其实这道题,主要就是卡我们时间和空间复杂度,处理好这些,其他就没有什么问题了。
首先,我们先记录每行和每列星号出现的频率,记为h[],l[]两个数组。
其次,我们遍历数组,每次都更改答案:
如果此字符为星号,答案更新为(答案)和(行列总数和h[i],和l[j]的差)中的小者;
如果此字符是点,答案更新为(答案)和(行列总数和h[i],和l[j]的差减一)中的小者。

然后贴下代码:

#include<bits/stdc++.h>
using namespace std;
string a[50010];
int n,m,h[50010],l[50010];
int main()
{
    int q;
   cin>>q;
   while(q--)
   {
  memset(h,0,sizeof(h)),memset(l,0,sizeof(l));
  cin>>n>>m;
  int sum=0x3f3f3f;
  for(int i=0;i<n;i++) cin>>a[i];
  for(int i=0;i<n;i++)
  {
   for(int j=0;j<m;j++)
   {
    if(a[i][j]=='*')
    {
     h[i]++;
     l[j]++;
    }
   }
  }
  for(int i=0;i<n;i++)
  {
   for(int j=0;j<m;j++)
   {
    if(a[i][j]=='*') sum=min(sum,n+m-h[i]-l[j]);
    else sum=min(sum,n+m-h[i]-l[j]-1);
   }
  }
  cout<<sum<<endl;
   }
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值