栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

acwing第35场周赛最小结果

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

acwing第35场周赛最小结果

最小结果
题目链接
描述

给你四个数字,3种操作符(只有加法和乘法两种),在不改变操作符顺序的情况下,每次操作舍弃原来的数,保留结果,求可以得到的最小结果

思路

刚开始打算使用贪心来做如果是加法就选最大的两个数进行操作,如果是乘法就选取最小的两个数进行操作,卡在了第14个数据上后来听了y总的思路发现暴搜是最好的解法不会少情况,每次按操作符全部进行操作,取结果最小的为答案,不用考虑特殊情况的存在,因为数的数量比较少,时间复杂度近似为O(1),其实是O(18),下面是y总版代码

#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long LL;
char op[5];
LL ans = 1e18;//最大值为3000的四次方会爆int
void dfs(vector v, int u)
{
    if (v.size() == 1) ans = min(ans, v[0]);
    else
    {
        for (int i = 0; i < v.size(); i ++)
            for (int j = i + 1; j < v.size(); j ++)
            {
                vector t;
                for (int k = 0; k < v.size(); k ++)
                    if (k != i && k != j) t.push_back(v[k]);
                if (op[u] == '*') t.push_back(v[i] * v[j]);
                else t.push_back(v[i] + v[j]);
                dfs(t, u + 1);
            }
    }
}
int main()
{
    vector v(4);
    for (int i = 0; i < 4; i ++) cin >> v[i];
    for (int i = 0; i < 3; i ++) cin >> op[i];
    dfs(v, 0);
    cout << ans << endl;
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/714927.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号