Codeforces878 A. Short Program

來源:互聯網
上載者:User

標籤:個數   clu   ++   位元運算   ace   狀態   ogr   tchar   ret   

題目類型:位元運算

傳送門:>Here<

題意:給出\(N\)個位元運算操作,要求簡化運算元量,使之結果不受影響(資料在1023之內)

解題思路

我們發現數位每一位是獨立的。也就是說,每一個操作可以看成是對數位二進位的每一位進行操作。而二進位只有0或1,因此如果我們能夠確定每一位有沒有變,是怎麼變的,就可以確定當前這一位發生了什麼操作。因此,很顯然我們可以把運算元量壓縮成3步:&,|,^。

每一位的變化無非四種情況:對於初始狀態和最終狀態,不過時0->0,0->1,1->0,1->1。

因此如果我們知道每一位初始狀態為0時的最終狀態,初始狀態為1的最終狀態,就可以確定是怎麼變的了

好了,那麼我們設定兩個數。一個是000000000(B),一個是111111111(B)。然後計算最終狀態。然後將這兩個數的同一位置的變化做一個比較

依然分類討論。

如果0->0且1->0,那麼等價於在這一位&0了。

如果0->0且1->1,等價於沒有操作

如果0->1且1->0,等價於^1

如果0->1且1->1,等價於|1

注意&的那個數剛開始也是111111111(B)

反思

將一個數的每一位割裂開來看似乎很自然,卻很難想。

對分類討論思想依然不是很敏感。分類討論思想在OI中是非常重要的,要多多去想分幾類,如何分類。

Code
/*By DennyQi 2018*/#include <cstdio>#include <queue>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int MAXN = 10010;const int MAXM = 20010;const int INF = 1061109567;inline int Max(const int a, const int b){ return (a > b) ? a : b; }inline int Min(const int a, const int b){ return (a < b) ? a : b; }inline int read(){    int x = 0; int w = 1; register char c = getchar();    for(; c ^ '-' && (c < '0' || c > '9'); c = getchar());    if(c == '-') w = -1, c = getchar();    for(; c >= '0' && c <= '9'; c = getchar()) x = (x<<3) + (x<<1) + c - '0'; return x * w;}int N,x,y,a,b,c,t,b1,b2;char opt[5];int main(){    scanf("%d", &N);    x = 0, y = (1<<10)-1;    a = y;    for(int i = 1; i <= N; ++i){        scanf("%s %d", opt, &t);        if(opt[0] == '&'){            x &= t, y &= t;        }        if(opt[0] == '|'){            x |= t, y |= t;        }        if(opt[0] == '^'){            x ^= t, y ^= t;        }    }    for(int i = 0; i < 10; ++i){        b1 = (1<<i) & y;        b2 = (1<<i) & x;        if(b1 && !b2) continue;        if(!b1 && !b2){            a -= (1<<i);        }        if(!b1 && b2){            c += (1<<i);            }         if(b1 && b2){            b += (1<<i);        }    }    printf("3\n");    printf("& %d\n| %d\n^ %d",a,b,c);    return 0;}

Codeforces878 A. Short Program

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.