CodeForces 245C Game with Coins

本文介绍了一个涉及两名玩家的策略游戏,玩家需要通过特定的操作来移除编号为1到n的箱子中的硬币,目标是最小化游戏完成所需的回合数。文章提供了一种有效的算法实现方案,包括关键的数据结构和步骤。

Game with Coins

http://codeforces.com/problemset/problem/245/C

time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Two pirates Polycarpus and Vasily play a very interesting game. They have n chests with coins, the chests are numbered with integers from 1 to n. Chest number i has ai coins.

Polycarpus and Vasily move in turns. Polycarpus moves first. During a move a player is allowed to choose a positive integer x (2·x + 1 ≤ n) and take a coin from each chest with numbers x, x, x + 1. It may turn out that some chest has no coins, in this case the player doesn't take a coin from this chest. The game finishes when all chests get emptied.

Polycarpus isn't a greedy scrooge. Polycarpys is a lazy slob. So he wonders in what minimum number of moves the game can finish. Help Polycarpus, determine the minimum number of moves in which the game can finish. Note that Polycarpus counts not only his moves, he also counts Vasily's moves.

Input

The first line contains a single integer n (1 ≤ n ≤ 100) — the number of chests with coins. The second line contains a sequence of space-separated integers: a1, a2, ..., an (1 ≤ ai ≤ 1000), where ai is the number of coins in the chest number i at the beginning of the game.

Output

Print a single integer — the minimum number of moves needed to finish the game. If no sequence of turns leads to finishing the game, print -1.

Sample test(s)
Input
1
1
Output
-1
Input
3
1 2 3
Output
3
Note

In the first test case there isn't a single move that can be made. That's why the players won't be able to empty the chests.

In the second sample there is only one possible move x = 1. This move should be repeated at least 3 times to empty the third chest.


  1. //这个题目重要的是在删除的时候要有最少重叠  
  2. //逆向法总是被忘记呢  
  3. //反正最远方的一定要去掉,最远方的只有一次机会遇到,找遇到机会最少的  
  4. //这道题就是类似于在一个图上进行最小覆盖,点就是整数点,每次走三步。为了在最后少花力气,就从远方走,这样  
  5. //可以使近点获得最多的附加。远点可以尽快归0 
每次将最右边的两次先去了,所以删除的次数count=max(a[i],a[i-1]

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=105;
int a[maxn];
int main()
{
    int n;
    while(cin>>n)
    {
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++) cin>>a[i];
        if(n==1 || n==2 || (n&1)==0){
            printf("-1\n");
            continue;
        }
        int Count=0;
        for(int i=n;i>1;i-=2)
        {
            if(a[i]!=0 || a[i-1]!=0){
                Count+=max(a[i],a[i-1]);
                if(a[i>>1]>=max(a[i],a[i-1]))
                    a[i>>1]-=max(a[i],a[i-1]);
                else a[i>>1]=0;
            }
        }
        Count +=a[1];
        printf("%d\n",Count);
    }
    return 0;
}


已经博主授权,源码转载自 https://pan.quark.cn/s/fb533687a163 《C++经典代码大全》是一部专门针对C++入门者的重要参考资料,其核心目标在于提供易于理解的C++编程范例,旨在协助新学者迅速领会C++语言的关键概念与技术要点。此压缩文件所包含的信息或许涵盖了从基础到高级的各类C++编程技巧,涉及面向对象编程中的类与对象、函数的应用、程序流程控制、数据结构设计、模板技术以及异常管理等多个关键领域。 1. **基础语法** - 变量声明与初始化:掌握如何声明并初始化不同数据类型的变量,例如整型(int)、浮点型(float)、字符型(char)等。 - 基本输入输出:学习运用`std::cin`和`std::cout`执行标准数据输入与输出操作。 - 控制流语句:熟练运用条件语句(if、if-else、switch-case)以及循环语句(for、while、do-while)来控制程序流程。 2. **类与对象** - 类的定义:学会如何构建类,包含其成员变量与成员函数的设定。 - 对象的创建与使用:掌握如何实例化对象,并经由对象访问类的成员函数。 - 封装:理解封装的理念,并学习使用private和public访问修饰符来保护数据。 - 构造函数与析构函数:掌握如何为类定义自定义的构造过程与析构过程。 3. **函数** - 函数的定义与调用:理解函数的功能与作用,以及如何进行函数的定义和调用。 - 函数参数:精通不同类型的参数传递方法,包括值传递和引用传递。 - 函数重载:学习在同一作用域内定义多个具有相同名称但参数列表不同的函数。 - 函数指针:了解函数指针的运用方法,及其在回调函数和模板中的应用场景。 4. **数组与字符串** -...
内容概要:本文研究了一种计及自适应预测修正的微电网模型预测控制(MPC)优化调度方法,并提供了Matlab代码实现。该方法针对微电网中风电出力等可再生能源的强不确定性,引入自适应预测修正机制,动态调整预测模型以提升短期功率预测精度,从而增强调度决策的准确性与系统运行的鲁棒性。研究构建了完整的MPC滚动优化框架,涵盖预测模型建立、多时间尺度优化求解、实时反馈校正等关键环节,实现了系统运行成本最小化、能源高效利用与功率平衡的多重目标。所提方法有效应对了负荷波动与新能源出力随机性带来的调度挑战,提升了微电网能量管理系统的智能化水平。; 适合人群:具备电力系统、自动化、控制理论或相关领域基础知识的研究生、科研人员及工程技术人员,尤其适合从事微电网优化、可再生能源集成、模型预测控制研究的专业人士,熟悉Matlab编程与优化算法者更佳。; 使用场景及目标:①应用于高比例可再生能源接入的微电网能量管理系统,提升调度方案的实时性与鲁棒性;②为不确定性环境下电力系统动态优化控制策略的研究提供仿真验证平台;③支持学术论文复现、科研课题攻关及实际工程项目的前期技术验证与方案预研。; 阅读建议:建议结合Matlab代码逐模块分析算法实现细节,重点关注预测模型构建与反馈修正机制的设计逻辑,通过调整风电出力、负荷需求等场景参数进行仿真实验,深入理解MPC在微电网调度中的滚动优化特性与自适应修正能力。
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 在信息技术领域中,字符编码扮演着处理文本数据的核心角色。本文着重研究在微控制器系统中,运用C语言如何将UTF-8编码格式转换为GBK编码格式,旨在处理串口通信、TF卡存储或LCD显示屏上可能出现的中文显示错误问题。我们将详细剖析UTF-8与GBK编码的运作机制,并研究基于Keil开发平台的C语言实现流程。 UTF-8是一种被广泛接纳的Unicode字符编码方案,它采用可变长度的字节序列来表示字符,每个Unicode字符都对应一个独一无二的数字标识,即码点。UTF-8的一个显著特点是对ASCII字符(英文文本)保持不变,因此在网络传输和文件存储方面展现出优秀的兼容性。 GBK编码,正式名称为“汉字内码扩展规范”,是中国大陆的标准化编码,是对GB2312编码的延伸,总共涵盖了20902个汉字及其他符号,每个字符使用两个字节来表示。GBK在GB2312的基础上扩充了许多繁体字、少数民族文字以及特殊符号,目的是满足更广泛的语言需求。 将UTF-8转换为GBK的主要难点在于GBK是一种固定长度的双字节编码,而UTF-8则是可变长度的编码。转换过程中需要将UTF-8的多字节序列解析为相应的Unicode码点,然后依据GBK的编码规则查找匹配的编码。这一过程通常借助查表法完成,即建立一个从Unicode码点到GBK编码的映射库。 在Keil开发环境中,使用C语言实现UTF-8到GBK的转换可以遵循以下步骤: 1. **构建查表法所需的GBK编码库**:需要准备一个包含所有GBK字符二进制形式的GBK编码库。这个库通常是一个二进制文件,其大小大约为41KB。 2. **解析UTF-8编码**...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值