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

链接:

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值