Gym - 101611D Decoding of Varints(阅读理解题 )
题意&思路: 首先根据红色边框部分的公式算出x,再有绿色部分得知,如果x是偶数则直接除以2,x是奇数则(x+1)/-2。
PS:这题有数据会爆掉unsigned long long,就是在最后奇数转换的时候。所以转换的时候可以变公式为-((x-1)/2+1)。
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <queue> 3 #include <cstdio> 4 #include <algorithm> 5 #include <cmath> 6 #include <cstring> 7 #define INF 0x3f3f3f3f 8 9 using namespace std; 10 typedef unsigned long long ll; 11 const int maxn = 11000; 12 ll buf[maxn]; 13 14 15 int main(){ 16 int n; 17 scanf("%d",&n); 18 for(int i=0; i<n; i++){ 19 scanf("%llu",&buf[i]); 20 } 21 for(int i = 0; i<n; i++){ 22 int j = i; 23 ll sum = 0,base = 1; 24 while(j<n){ 25 if(buf[j]>=128){ 26 sum += (buf[j]-128)*base; 27 base*=128; 28 j++; 29 } 30 else{ 31 sum = sum + buf[j]*base; 32 i = j; 33 break; 34 } 35 } 36 if(sum&1) 37 printf("%lld\n",(long long)-((sum-1)/2+1)); 38 else 39 printf("%llu\n",sum/2); 40 } 41 return 0; 42 }