SPOJ AMR12G The Glittering Caves of Aglarond 解题报告

来源:互联网 发布:用dwcs5制作淘宝 编辑:程序博客网 时间:2024/05/20 06:08

题目

Summer Training 06 - Amritapuri 2012 总结

题意:

一些‘.'和'*'组成的矩阵,每次可以翻转一行,使得该行的‘.'和'*'互相转换,求恰好转K次后最多的'*'。

题解:

将行分两类:*比.多的和少的。将少的排序,那么优先翻转使得*增加多的。如果翻完后还没翻够,如果是偶数就相当于不用再翻,否则翻一次使得*减少最少的。


//Time:0ms//Memory:3277KB//Length:1062B#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>using namespace std;#define MAXN 60char str[MAXN][MAXN];int num[2][MAXN],h[2];int main(){    //freopen("/home/moor/Code/input","r",stdin);    int ncase,n,m,k,ans=0;    scanf("%d",&ncase);    while(ncase--)    {        ans=0;        scanf("%d%d%d",&n,&m,&k);        for(int i=0;i<n;++i)            scanf("%s",str[i]);        h[0]=h[1]=0;        for(int i=0;i<n;++i)        {            int cnt=0;            for(int j=0;j<m;++j)                if(str[i][j]=='*')                    ++cnt,++ans;            if(cnt*2<m)                num[0][h[0]++]=cnt;            else    num[1][h[1]++]=cnt;        }        sort(num[0],num[0]+h[0]);        for(int i=0;i<h[0]&&k;++i,--k)        {            ans+=m-num[0][i]*2;            num[1][h[1]++]=m-num[0][i];        }        if(k>0&&k&1)        {            k=1;            sort(num[1],num[1]+h[1]);            ans-=2*num[1][0]-m;        }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击