首页 > 其他分享 >【NOI OpenJudge1789】算24(搜索)

【NOI OpenJudge1789】算24(搜索)

时间:2023-04-04 11:01:58浏览次数:39  
标签:24 return NOI double 枚举 括号 flag OpenJudge1789 op


problem

  • 给定4个数,加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。
  • 问是否存在一种方式使得得到的表达式的结果等于24。

solution

正常的中缀表达式枚举和计算难度都约等于0,麻烦的是括号的枚举和处理。
这里只要求满足的结果,所以换一种方式拿掉括号——打乱顺序即可(括号的用处本质就是改变运算顺序),,

  • 做法就是通过枚举排列或者随机运算的方式去掉括号,剩余的运算符和数字丢到一起DFS即可。
  • 具体写法就是每次从剩余的数中随机取出两个数,并用加减乘除合并它们。
  • 小技巧:用排序代替数组来去掉不用位置写起来比较简单。(避免枚举的时候判断,也优化了效率。

codes

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int uinf = -10000000;//过程值可以为负,所以要够小

double a[5]; bool flag;
double opv(double x, double y, int op){
    if(op==1)return x+y;
    if(op==2)return x-y;
    if(op==3)return x*y;
    if(op==4)return x/y;
}
void dfs(int x){
    sort(a+1,a+5);//用排序的方法把位置去掉
    if(flag)return ;
    if(x == 4){
        if(abs(a[4]-24)<0.001)flag = 1;//注意精度问题
        return ;
    }

    double b[5]; for(int i = 1; i <= 4; i++)b[i] = a[i];
    //在剩余的所有数里随便选2个
    for(int i = x; i <= 4; i++){
        for(int j = x; j <= 4; j++){
            if(i == j)continue;
            for(int k = 1; k <= 4; k++){//随便选一种运算
                a[i] = opv(a[i],a[j],k);
                a[j] = uinf;
                dfs(x+1);
                for(int i = 1; i <= 4; i++)a[i] = b[i];
            }
        }
    }
}

int main(){
    while(cin>>a[1]>>a[2]>>a[3]>>a[4] && a[1]){
        flag = 0;
        dfs(1);
        if(flag)cout<<"YES\n";
        else cout<<"NO\n";
    }
    return 0;
}


标签:24,return,NOI,double,枚举,括号,flag,OpenJudge1789,op
From: https://blog.51cto.com/gwj1314/6168219

相关文章

  • [oeasy]python0124_Code_page_437_IBM_5150_点阵式字形码_显示器效果
    字符显示器回忆上次内容简体和繁体的汉字字符数量都超级大感谢王选和陈堃銶等前辈发明了激光照排技术中文排版从此使用上了gb2312编码 ​ 添加图片注释,不超过140字(可选) 纸张之外显示器是更先进的输出设备 计算机是......
  • NOIST2023 + HEOI2023 游记
    好像是被打破防了。春季赛春季赛忘的差不多了,但是总而言之打假赛。day0去的是叫英庄李家的酒店,下午去看海了。手机在看到海并拍摄一张照片后残忍关机了。......
  • 24-springboot-thymeleaf的表达式
    1.添加热部署,为了测试不用频繁重启<!--热部署插件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional><!--防止将该依赖传递到其他模块中--></depen......
  • 首份视频报告:日本网民每月平均点击242.5个视频
    全球互联网信息服务提供商comScore最近对外公布了一份关于亚洲在线视频的消费报告,给那些研究消费者数字行为的公司带来了很好的参考价值。该公司的亚太地区高级副总裁JoeNguyen指出:“观看在线视频已经成为大部分消费者打发时间的活动,这为内容提供商和广告商带来了商机。我们预计......
  • 题24
    19、构造器Constructor是否可被override? 构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。20、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?抽象类中是否可以有静态的main方法?接口可以继承接口......
  • pytest学习和使用24-如何清空allure报告历史记录?我每次都手动删除,有点Low了~
    (24-如何清空allure报告历史记录?我每次都手动删除,有点Low了~)1为什么要进行allure历史记录清空?没运行一次生成报告的命令,在allure报告的目录下就生成一次报告记录;如果进行很多次调试,那就有很多个报告历史记录;这样每次查看报告时就会显示历史的用例运行情况,比较乱且可能不是我......
  • 2024考研408Week3
    一、本周总结:使用时间:(先目标40h,未达到)总计20h16min,数学8h52min,专业课4h4min,英语7h20min。本周因酒店安排的空间较小+自制力不好,导致周一到周五效率不高,周末效率还可以。二、存在问题:1.数学、专业课投入时间均不够,专业课很多概念理解不深刻。三、进步:1.英语阅读速度和正确率有所......
  • 2024届计算机秋招100天备战:力扣每日打卡挑战全记录 & 面试题总结
    最近两个月力扣困难题不再落下,打卡全满勤,激发了持续刷题的斗志。这里将持续记录打卡过程中的难题和面试八股。2023/4/21039.多边形三角剖分的最低得分题目大意:多边形每个节点有一个数值,将多边形三角剖分,得分为所有三角形节点乘积之和。求三角剖分后的最低得分。做题评价:虽......
  • NOI 1.8编程基础之多维数组
    02:同行列对角线的格子1.描述输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中(行列均从1开始编号),与格子(i,j)同行、同列、同一对角线的所有格子的位置。如:n=4,i=2,j=3表示了棋盘中的第二行第三列的格子,如下图:第一列第二列第三列第四列     ......
  • HNOI2023 游记
    Day???去中山集训回来了。Day0没啥心情做题,上午随便写了点板子,然后扫描线写了一个小时调不出来,感觉不是很好。下午听了下动员,听完之后心态确实好些了,虽然很久没做什么题,但是在考场上写满暴力不挂分似乎并不是很难达到的目标。晚上到考场旁边订了个酒店,稍微思考了一下明天的......