Decoding of Varints Gym
阿新 • • 發佈:2018-12-11
這道題是真的長,果然學長們讀題超厲害,我們都沒讀懂題目,實際上這道題是說給你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; }