好玩的木樁(思維題)

Tiny_W發表於2018-03-24

好玩的木樁

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

一天,小明來到一個農場,看到農場上有許許多多的木樁,這些木樁被擺成一個m*n的矩陣,而且木樁的長度只有兩種,那麼我們用1來表示長木樁,0表示短木樁,小明突然想到一個好玩的事情:如果我們能移動矩陣的行,問最大可以得到全是長木樁(都是1)矩陣的面積。

Input:

第一行,輸入兩個數m,n,(0<m,n<=5000);
然後輸入m*n大小的0,1矩陣。

Output:

最大可以得到全是長木樁(都是1)矩陣的面積。對於每組資料,輸出答案,佔一行。

Sample Input:

4 3
100
011
000
101

Sample Output:

2

思路:先寫出每行的每列向左延伸的最大值,如01111就是01234;此後,再對每列進行排序(從小到大),這樣就能保證上面的都能被下面的擴充。本題還有個關鍵點,如何對二維陣列的列進行排序?(這個可以轉換下思維)


附上AC程式碼:


                          

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
    int n;
    while(cin >> n){
    while(n--)
    {
        ll l,r;
        cin >> l >> r;
        int rr[100];
        int ll1[100];
        memset(rr,0,sizeof(rr));
        memset(ll1,0,sizeof(ll1));
        int s = 0;
        int s2 = 0;
        ll r1 = r;
        while(r)
        {
            if(r&1)
                rr[s++] = 1;
            else
                rr[s++] = 0;
            r>>=1;
        }
        while(l)
        {
            if(l&1)
                ll1[s2++] = 1;
            else
                ll1[s2++] = 0;
            l>>=1;
        }
        int maxx = max(s,s2);
        int f = -1;
        ll sum = 0;
        for(int i = maxx-1;i >= 0;i--)
        {
            if(ll1[i] != rr[i])
            {
                f = i;
                break;
            }
            else if(ll1[i] == 1)
            sum+=(ll)(pow(2,i)+0.5);
        }
        ll x = 1;
        if(f == -1)
            cout << r1 <<endl;
        else
        {
            f++;
            while(f--)
            {
                sum+=x;
                x<<=1;
            }
            cout << sum <<endl;
        }
    }}
    return 0;
}

相關文章