hdu 5396 Expression ||2015 Multi-University Training Contest 9 || 簡單模擬

hdu 5396 請戳

  1. 題意:
    給小瘋子一個大小爲 n*m 的棋盤,每個格子有都有錢,要小傻子在棋盤裏面走一條一次性的路(沒個格子只能走一次),從(0,0) 到(n - 1, m - 1), 還要撿起上面的錢, 要求撿到的錢加起來最多,更可怕的是要小傻子背出自己是怎麼走的。
    小傻子真慘,help!

  2. 思路:
    n 或 m 爲奇數時:小傻子會走!
    n 和 m 都爲偶數時:誒,相鄰格子爲不同顏色,所有的格子的橫縱座標加起來爲奇數裏面不撿裏面最少錢,就可以了的滿足小瘋子無理的要求了。
    至於要怎麼做,給小傻子看程序運行結果就好了。

  3. 複雜度:
    時間複雜度:O(n * m)
    空間複雜度:O(1)

  4. 代碼

/* ***********************************************
Author        :Ilovezilian
Created Time  :2015/8/18 17:16:13
File Name     :1007_1.cpp
************************************************ */

#include <bits/stdc++.h>
#define INF 0x7fffffff
using namespace std;
const int N = 0, mod = 1e9+7;


void solve()
{
    int n, m;
    while(~scanf("%d%d", &n, &m))
    {
        int mx, my, mv = INF, sum = 0, x;
        for(int i = 0; i < n; i ++) for(int j = 0; j < m; j ++)
        {
            scanf("%d", &x);
            sum += x;
            if((i + j) & 1 && x < mv) mv = x, mx = i, my = j;
        }

        //printf("mx = %d my = %d mv = %d\n", mx, my, mv);

        if(n&1)
        {
            printf("%d\n", sum);

            for(int i = 0; i < n; i ++) for(int j = 0; j < m; j ++) if(i != n - 1 || j != m - 1)
                printf("%c", j != m - 1 ? ( i&1 ? 'L' : 'R') : 'D');
        }
        else if(m&1)
        {
            printf("%d\n", sum);

            for(int i = 0; i < m; i ++) for(int j = 0; j < n; j ++) if(i != m - 1 || j != n - 1)
                printf("%c", j != n - 1 ? ( i&1 ? 'U' : 'D') : 'R');
        }
        else
        {
            printf("%d\n", sum - mv);

            bool di = 0; ///這個變量很重要x3。
            for(int i = 0; i < m; i ++)
            {
                if(my / 2 * 2 == i)
                {
                    for(int j = 0; j < n; j ++)
                    {

                        if(j == mx)
                        {
                            if(j != n - 1) printf("D");
                            if(j == n - 1 && i + 1 != m - 1) printf("R");
                            di = 1;
                        }
                        else if(j != n - 1)
                            printf("%s", (j + di) & 1 ? "LD" : "RD");
                        else if(j == n - 1 && i + 1 != m - 1)
                            printf("RR");
                        else 
                            printf("R");
                    }
                    i ++;
                }
                else for(int j = 0; j < n ; j ++)if(i != m - 1 || j != n - 1)
                    printf("%c", j != n - 1 ? (((i+di) & 1) ? 'U' : 'D') : 'R');
            }
        }
        printf("\n");
    }
}

int main()
{
    //freopen("","r",stdin);
    //freopen("","w",stdout);
    solve();   
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章