Gym - 100989L dfs

本文介绍了一个数学问题:如何通过最少的符号更改使一个由加减运算组成的等式成立。利用深度优先搜索(DFS)算法,文章提供了一种有效的解决方案,并附带了完整的C++实现代码。

Time limit

1000 ms

Memory limit

262144 kB

题目描述:

AbdelKader enjoys math. He feels very frustrated whenever he sees an incorrect equation and so he tries to make it correct as quickly as possible!

Given an equation of the form: A1 o A2 o A3 o ... o An  =  0, where o is either + or -. Your task is to help AbdelKader find the minimum number of changes to the operators + and -, such that the equation becomes correct.

You are allowed to replace any number of pluses with minuses, and any number of minuses with pluses.

Input

The first line of input contains an integer N (2 ≤ N ≤ 20), the number of terms in the equation.

The second line contains N integers separated by a plus + or a minus -, each value is between 1 and 108.

Values and operators are separated by a single space.

Output

If it is impossible to make the equation correct by replacing operators, print  - 1, otherwise print the minimum number of needed changes.

Examples

Input

7
1 + 1 - 4 - 4 - 4 - 2 - 2

Output

3

Input

3
5 + 3 - 7

Output

-1

 

 

简单dfs

 

 

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

int ans=30,flag=0,al[25],n;

 

char bl;
void dfs(int x,int y,int dfst,int f)

 

// x(深度)  y(是否改变符号(1为不变)(-1为改变))  dfst(为dfs到x深度时的和)  f(记录符号改变的次数)

 

//因为只需要得到最后一组的数据  所以使用dfst和f来记录前x个数总和和前x次符号改变次数的总和

//不需要使用数组来生成线段树记录每一次dfs的结果
{
    dfst=al[x]*y+dfst;
    if(y==-1)
    {
        f=f+1;
    }
    else
    {
        f=f;
    }
    if(x==n)
    {
        if(dfst==0)
        {
            flag=1;
            ans=min(ans,f);
        }
        return ;
    }
    dfs(x+1,1,dfst,f);//符号不变
    dfs(x+1,-1,dfst,f);//符号改变
}
int main()
{
    cin>>n;
    for(int n1=1;n1<=n;n1++)
    {
        if(n1==1)
        {
            cin>>al[n1];
        }
        else
        {
            getchar();
            cin>>bl;
            getchar();
            cin>>al[n1];
            if(bl=='-')
            {
                al[n1]=-al[n1];
            }
        }
    }
    dfs(1,1,0,0);
    if(flag==1)//flag判断能否得到和为0
    {
        cout<<ans<<endl;
    }
    else
    {
        cout<<-1<<endl;
    }
}

内容概要:本文详细介绍了一种基于Simulink的表贴式永磁同步电机(SPMSM)有限控制集模型预测电流控制(FCS-MPCC)仿真系统。通过构建PMSM数学模型、坐标变换、MPC控制器、SVPWM调制等模块,实现了对电机定子电流的高精度跟踪控制,具备快速动态响应和低稳态误差的特点。文中提供了完整的仿真建模步骤、关键参数设置、核心MATLAB函数代码及仿真结果分析,涵盖转速、电流、转矩和三相电流波形,验证了MPC控制策略在动态性能、稳态精度和抗负载扰动方面的优越性,并提出了参数自整定、加权代价函数、模型预测转矩控制和弱磁扩速等优化方向。; 适合人群:自动化、电气工程及其相关专业本科生、研究生,以及从事电机控制算法研究与仿真的工程技术人员;具备一定的电机原理、自动控制理论和Simulink仿真基础者更佳; 使用场景及目标:①用于永磁同步电机模型预测控制的教学演示、课程设计或毕业设计项目;②作为电机先进控制算法(如MPC、MPTC)的仿真验证平台;③支撑科研中对控制性能优化(如动态响应、抗干扰能力)的研究需求; 阅读建议:建议读者结合Simulink环境动手搭建模型,深入理解各模块间的信号流向与控制逻辑,重点掌握预测模型构建、代价函数设计与开关状态选择机制,并可通过修改电机参数或控制策略进行拓展实验,以增强实践与创新能力。
在编程竞赛和算法训练中,Codeforces Gym 提供了大量高质量的训练题目,这些题目通常用于团队训练或个人提升。Gym 103861L 是其中一道编号问题,尽管目前无法直接访问该题目的完整内容,但可以通过编号规则和 Gym 题目的一般特征进行推测与分析。 通常,Gym 编号如 "Gym 103861L" 中的前六位数字代表比赛或训练集的编号,而最后的字母 "L" 表示题目的顺序。这类题目可能涉及动态规划、图论、字符串处理或数学计算等算法领域。 对于类似编号问题的解决方案,通常需要以下几个步骤: - **理解问题描述**:仔细阅读题目要求,明确输入输出格式,以及约束条件。 - **分析问题模型**:将问题抽象为数学模型或算法模型,例如最短路径、背包问题、区间调度等。 - **设计算法**:根据模型选择合适的算法,例如贪心、深度优先搜索(DFS)、广度优先搜索(BFS)、动态规划(DP)等。 - **实现代码**:编写高效且正确的代码,并注意边界条件和数据类型的选择。 - **调试与优化**:通过测试样例验证程序的正确性,并进行必要的性能优化。 以引用中的 Gym 100090L 问题为例,其涉及前缀和数组的还原问题,解决思路是通过差分数组的方法,将前缀和数组转换回原始数组。具体实现如下: ```cpp #include <cstdio> #include <iostream> using namespace std; typedef long long ll; int main() { int n; ll sum[200005]; while (~scanf("%d", &n)) { for (int i = 1; i <= n; i++) scanf("%lld", &sum[i]); sum[0] = 0; for (int i = 1; i <= n; i++) { printf("%lld%c", sum[i] - sum[i - 1], i == n ? '\n' : ' '); } } return 0; } ``` 对于 Gym 103861L 的问题,如果已知其具体内容,可以采用类似的方式进行建模与实现。建议访问 [Codeforces Gym 页面](https://codeforces.com/gym) 并搜索 "103861" 查找该比赛的具体信息,从而获取完整的题目描述和测试用例。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值