Sicily 4874. POGODAK

2012年每周一赛第二场第二题,高效模拟问题。说白了就是一个骰子转来转去的问题,每次翻转产生的变化可以自由模拟,这不是问题。问题是如果是直接模拟的话,时间复杂度是O(RC),而R和C分别都可以高达100000,它们的积就过于大了。而事实上,在每一行中翻转时,每翻转4次就会回到原位,那么实际上需要模拟的就只是R*C%4次而已,这样就可以把问题化简了。

Run Time: 0.01sec

Run Memory: 304KB

Code Length: 1264Bytes

Submit Time: 2012-03-03 20:10:23

// Problem#: 4874
// Submission#: 1231193
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <cstdio>
#include <string>
using namespace std;

struct Cube {
    string number;
    Cube() { number = "136425"; }
    int show( int i ) { return number[ i ] - '0'; }
    void right() {
        char temp = number[ 0 ];
        number[ 0 ] = number[ 3 ];
        number[ 3 ] = number[ 2 ];
        number[ 2 ] = number[ 1 ];
        number[ 1 ] = temp;
    }
    void down() {
        char temp = number[ 0 ];
        number[ 0 ] = number[ 5 ];
        number[ 5 ] = number[ 2 ];
        number[ 2 ] = number[ 4 ];
        number[ 4 ] = temp;
    }
    void left() {
        char temp = number[ 0 ];
        number[ 0 ] = number[ 1 ];
        number[ 1 ] = number[ 2 ];
        number[ 2 ] = number[ 3 ];
        number[ 3 ] = temp;
    };
};

int main()
{
    Cube cube;
    int R, C;
    int i, j;
    long long sum = 0;

    scanf( "%d%d", &R, &C );
    for ( i = 1; i <= R; i++ ) {
        sum += C / 4 * ( cube.show( 0 ) + cube.show( 1 ) + cube.show( 2 ) + cube.show( 3 ) );
        for ( j = 1; j < C % 4; j++ ) {
            sum += cube.show( 0 );
            i % 2 == 1 ? cube.right(): cube.left();
            }
        if ( j == C % 4 )
            sum += cube.show( 0 );
        cube.down();
    }
    printf( "%lld\n", sum );

    return 0;

}                                 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值