1. 程式人生 > >CodeForces 245C-Game with Coins

CodeForces 245C-Game with Coins

題意:給你一個n,緊接著n個正數,然後有一種操作:選擇一個x滿足(x*2+1<=n)一次可以把下標為  x,2*x,2*x+1的三個數同時減一;

問,最少幾次操作可以使n個數字變為零(已經是0的就不會再減1了)

這裡一個坑點就是    即使下標為x的數已經是零了,你還是可以選擇  x,並且 讓x, 2*x , 2*x+1中不為零的減一;

這個題說要最少的次數使所有數字減為零,因為選擇前面的x可以同時讓後面的2*x,2*x+1都減少,所以從後面開始,先讓後面的減為零,依次往前推減少的數量;

這樣也是用的操作最少的,簡而言之就是讓一次操作,作用盡量多的下標;

程式碼如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <vector>
 6 #include <set>
 7 #include <algorithm>
 8 using namespace std;
 9 typedef long long ll;
10 const int maxn=1e5+5;
11 int a[maxn];
12 int main()
13 { 14 int n; 15 cin>>n; 16 for(int i=1;i<=n;i++) 17 { 18 cin>>a[i]; 19 } 20 int m=(n-1)/2; 21 if(m<=0||(m*2+1<n)) 22 { 23 printf("-1\n"); 24 return 0; 25 } 26 ll sum=0; 27 for(int i=n;i>1;i-=2) 28 { 29 if
(a[i]!=0||a[i-1]!=0) 30 { 31 sum+=max(a[i],a[i-1]); 32 if(a[i>>1]>=max(a[i],a[i-1])) 33 a[i>>1]-=max(a[i],a[i-1]); 34 else a[i>>1]=0; 35 } 36 } 37 sum+=a[1]; 38 cout<<sum<<endl; 39 40 return 0; 41 }