NC15889. 编码的奥秘
描述
“隐藏在黑暗中的钥匙啊,在我面前显示你真正的力量吧,现在以你的主人黑猫之名,封印解除——“
输入描述
第一行输入一个n(1≤n≤10000 ) —— 编码后数字数列的长度
接下来有n个数ai( 0 ≤ai≤255)
保证输入一定是正确无误的,即就是根据输入一定可以计算得到一个数列,他们每一个值都是
输出描述
每一行输出一个解码后的数字。
示例1
输入:
5 0 194 31 195 31
输出:
0 2017 -2018
C++14(g++5.4) 解法, 执行用时: 6ms, 内存消耗: 480K, 提交时间: 2018-05-13 16:00:06
#include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <cctype> #include <vector> #include <string> using namespace std; typedef unsigned long long ull; int main() { int n; scanf("%d", &n); ull last = 0; int pos = 0; for(int i = 0; i < n; ++i) { int c; scanf("%d", &c); last |= (c & 127ULL) << pos; pos += 7; if(~c & 128) { if(~last & 1) printf("%llu\n", last / 2); else printf("-%llu\n", last / 2 + 1); last = 0; pos = 0; } } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 7ms, 内存消耗: 364K, 提交时间: 2018-05-13 16:50:30
#include<stdio.h> #define ll unsigned long long ll n; ll temp[100]={1}; int main() { ll t; scanf("%llu",&t); for(ll i=1;i<100;i++) temp[i]=temp[i-1]*2; ll ans=0,xs=0; for(ll i=1;i<=t;i++) { scanf("%llu",&n); if(n>=128) ans+=(n-128)*temp[xs],xs+=7; else { ans+=n*temp[xs]; if(ans%2) printf("-"),ans+=1; ans/=2; printf("%llu\n",ans); xs=0,ans=0; } } return 0; }