题意&思路: 首先根据红色边框部分的公式算出x,再有绿色部分得知,如果x是偶数则直接除以2,x是奇数则(x+1)/-2。
PS:这题有数据会爆掉unsigned long long,就是在最后奇数转换的时候。所以转换的时候可以变公式为-((x-1)/2+1)。
代码:
#include <iostream>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
typedef unsigned long long ll;
const int maxn = 11000;
ll buf[maxn];
int main(){
int n;
scanf("%d",&n);
for(int i=0; i<n; i++){
scanf("%llu",&buf[i]);
}
for(int i = 0; i<n; i++){
int j = i;
ll sum = 0,base = 1;
while(j<n){
if(buf[j]>=128){
sum += (buf[j]-128)*base;
base*=128;
j++;
}
else{
sum = sum + buf[j]*base;
i = j;
break;
}
}
if(sum&1)
printf("%lld\n",(long long)-((sum-1)/2+1));
else
printf("%llu\n",sum/2);
}
return 0;
}