Gym - 101611D - Decoding of Varints( 爆unsigned 的水题)

版权声明:沃斯里德小浩浩啊 https://blog.csdn.net/Healer66/article/details/82779419

链接:

https://odzkskevi.qnssl.com/9c253207c02c61937a00eb712e34af9b?v=1536825252

题意:

x = (b0 - 128)·2^0 + (b1 - 128)·2^7 + (b2 - 128)·2^14 + ... + (bm - 2 - 128)·2^7·(m - 2) + bm - 1·2^7·(m - 1)

对于上式,给出 连续的b 让你求x 一旦碰到一个小于等于128 算一个结束

算出来的答案需要解码偶数/2,奇数加1/-2;

注意,test中有一个样例是unsigned最大值,加一的话直接就爆了,所以需要 -((ans - 1) / 2) - 1;

坑死。

#include <bits/stdc++.h>
typedef unsigned long long ll;
using namespace std;

ll tpow(ll m)
{
    m*=7;
    ll ans=1;
    while(m--) ans*=2;
    return ans;
}
ll a[10005];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;++i){
        scanf("%llu",&a[i]);
    }
    int m;
    for(int i=0;i<n;++i){

        m=0;
        ll ans=0;
        for(int j=i;j<n;++j){
            if(a[j]>=128){
                ans+=(a[j]-128)*tpow(m++);
            }
            else{
                ans+=a[j]*tpow(m);
                  i=j;
                break;
            }
        }
        if(ans&1)
           printf("%lld\n", -((ans-1)/2)-1);
        else printf("%lld\n",ans/2);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Healer66/article/details/82779419