Codeforces Round #638 (Div. 2) 比赛人数15215
[codeforces 1348A] Phoenix and Balance 一个顶俩
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1348/problem/A
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
A - Phoenix and Balance | GNU C++17 | Accepted | 30 ms | 0 KB |
比赛时,第一发WA,将本人从昏昏欲睡中拉了回来。
观察样例
2
2
4
2
6
2^1=2,2^2=4很明显4>2
2^1=2,2^2=4,2^3=8,2^4=16很明显16>2+4+8
可以看到最后一个数,具有无与伦比的地位
(数组中扣除了最后一个数,剩下的元素计算出来的和,竟然抵不过最后一个数).
故分成两组,可这样分
第一组,在最后一个数之前连续找n/2个数;
剩下的数作为第二组。
计算需要用到等比数列求和公式S=(a1-an*q)/(1-q)
具体可见代码
#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
LL c[32];
int main(){
LL t,n,a,b,i;
c[0]=1;
for(i=1;i<=30;i++)c[i]=c[i-1]*2;//计算2^i
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
a=(c[1]-c[n]*2)/(1-2);//整个数组的和
b=(c[n-1-n/2+1]-c[n-1]*2)/(1-2);//在最后一个数之前连续找n/2个数的和
a-=b;//另一组元素和的计算
printf("%lld\n",abs(a-b));
}
return 0;
}