codeforces 245C Game with Coins

题意:一堆编号由1-n的箱子,每次取三个箱子,编号为n,2*n,2*n-1,取出其中的一枚银币,问最少取多少次可把里面的钱去完。当有箱子无法取到时(比如n小于三,或者为偶数),输出负一。

做法:贪心策略。远方的箱子取到的机会最少,可能只有一次,而且在去远方的箱子时,近端的箱子也能跟着收益,所以,从第n个箱子进行逆推。

#include<stdio.h>
#define LMT 105
//这个题目重要的是在删除的时候要有最少重叠
//逆向法总是被忘记呢
//反正最远方的一定要去掉,最远方的只有一次机会遇到,找遇到机会最少的
//这道题就是类似于在一个图上进行最小覆盖,点就是整数点,每次走三步。为了在最后少花力气,就从远方走,这样
//可以使近点获得最多的附加。远点可以尽快归0
int a[LMT];
int main(void)
{
    int i,n,ans=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)scanf("%d",&a[i]);
    if(n<3||n%2==0)printf("-1\n");
    else
    {
        for(i=n;i>=1;i--)
        if(i%2)
        {
            while(a[i]>0)
            {
                a[i]--;
                a[i-1]--;
                a[i/2]--;
                ans++;
            }
        }
        else
        {
            while(a[i]>0)
            {
                a[i+1]--;
                a[i]--;
                a[i/2]--;
                ans++;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(codeforces 245C Game with Coins)