1. 程式人生 > >Decoding of Varints Gym

Decoding of Varints Gym

題目連結

這道題是真的長,果然學長們讀題超厲害,我們都沒讀懂題目,實際上這道題是說給你n個數是幾個數的128進位制係數,求出來每個數非負數sum後,如果求出來是偶數,直接輸出x為sum / 2,否則輸出x為-sum / 2 + 1。由於x的範圍剛好是long long即-2^63 ~ 2^63-1,因此sum的範圍就是unsigned long long即0~2^64,這裡有一點特殊技巧就是當sum為奇數時不能用(sum + 1) / 2,這樣會爆。其他就沒了,加油鴨

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
    int n,x,cnt = 0;
    ull sum = 0;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&x);
        if(x < 128)
        {
            sum += x * (1ll << 7 * cnt);
            if(sum % 2) printf("-%llu\n",sum / 2 + 1);
            else printf("%llu\n",sum / 2);
            sum = cnt = 0;
        }
        else
        {
            sum += (x - 128) * (1ll << 7 * cnt);
            cnt++;
        }
    }
    return 0;
}