Codeforces Round #102 (Div. 2) D. Help General

这个题比赛的时候没有想到怎么做,看了别人的代码差不多能明白了。c因为把初值设小了也挂掉。rating还是继续降。

        if (n > m)swap(n, m);

        if (n == 1)cout << m << endl;
       
        else if (n == 2){

                int t = m % 4, ans = 0;

                if (t > 2)ans += 4;
                else ans += t * 2;
               
                cout << m / 4 * 4 + ans << endl;

        }
        else {
                cout << (n * m + 1) / 2 << endl;
        }

首先假设n是较小的那一个:

如果n==1输出m,因为相互冲突的两个肯定不在一行或者一列。

如何n==2,那就把m分成4,4,4,。。。4.。。m%4.因为如果两个位置冲突肯定是在一个4以内。如果每个4列都把前两列放满,那就不会跟下一列冲突。任何2X4的方块内最多都只能摆4个,这个是很显然的。再看m%4的值,就当成是下一块的前m%4列即可。

如果n>2那说明n,m都大于2.这个时候最优的策略是摆一个空一格。这样就是最优的。

posted @ 2012-01-13 11:21  like@neu  阅读(239)  评论(1编辑  收藏  举报