热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

模拟6月7日

题目描述jyx和cyy打赌,比谁24点算得快,算得慢的那个人请客。24点的规则是这样的:给定4个1..9的整数,用括号改变运算顺序,通过加、减、乘、除中的一系列运算,得到整数24

题目描述

jyx和cyy打赌,比谁24点算得快,算得慢的那个人请客。24点的规则是这样的:给定4个1..9的整数,用括号改变运算顺序,通过加、减、乘、除中的一系列运算,得到整数24。注意所有中间结果必须是整数(例如(2*2)/4是允许的,而2*(2/4)是不允许的)。为了赢得这个比赛,请写一个程序帮助我作弊,快速地计算出24点。

输入输出格式

输入格式:

一行4个整数,为给定的4个数字。输入数据保证有解。

输出格式:

一行,以字符串的形式输出结果。注意将每一步的运算的括号补齐(例如(3+5)+6和3* (5+6))。如果有多种解答,输出字典顺序最小的一个。

输入输出样例

输入样例#1: 复制
2 3 5 7 
输出样例#1: 复制
(((3*5)+2)+7)

题目很冗杂;


1/关于字典序的问题我们发现对括号有三种种情况:(((a+b)+c)+d)或((a+b)+(c+d))或(a+(b+(c+d))) 然后会发现第一种和第三种其实是完全等效的。左,中,右,三种;字典序优先,所以选择第一种;

那么有两种入选(((a+b)+c)+d)或((a+b)+(c+d));

第一种是从头到尾算下来,第二种先前两个算,接着后两个算,最后两边得到的结果算在一起;

两种情况要分开打,麻烦没办法;

2/数字和运算符交替搜索是很难想到的;dfs中带一个参数是选择是数字还是字符的,如果是ture则为数字,反之为运算符;

3。用了哈希,搜索记录的是运算符的下标;用一个函数来运算;

4/出现不能除进ruturn;

#include
#include
#include
using namespace std;
int q1[20],q2[20];
char hash[5]={0,'*','+','-','/'};
int n[5];int used[5];
int operate(int a,int b,int c)
{
    switch(c)
    {
        case 1:return a*b;
        case 2:return a+b;
        case 3:return a-b;
        case 4:if(a%b==0)return a/b;else return -10;
    }
    return -10;
}
void dfs1(int u,bool o);
void dfs2(int u,bool o);
int main()
{
    for(int i=1;i<=4;i++)scanf("%d",&n[i]);
    sort(n+1,n+5);
    dfs1(1,1);dfs2(1,1);
    return 0;
}
void dfs1(int u,bool o)
{
    if(u==8)
    {
        int ans=operate(q1[1],q1[3],q2[2]);
        if(ans==-10)return ;
        ans=operate(ans,q1[5],q2[4]);
        if(ans==-10)return ;
        ans=operate(ans,q1[7],q2[6]);
        if(ans==24)
        {
            printf("(((%d%c%d)%c%d)%c%d)",q1[1],hash[q2[2]],q1[3],hash[q2[4]],q1[5],hash[q2[6]],q1[7]);
             exit(0);
        }
    }
    else
    if(o)
    {
        for(int i=1;i<=4;i++)
        if(!used[i])
        {
            q1[u]=n[i];
            used[i]=1;
            dfs1(u+1,!o);
            used[i]=0;//!!!1
        }
    }
    else
    {
        for(int i=1;i<=4;i++)
        {
            q2[u]=i;
            dfs1(u+1,!o);
        }
    }
}
void dfs2(int u,bool o)
{
    if(u==8)
    {
        int ans1=operate(q1[1],q1[3],q2[2]);
        if(ans1==-10)return ;
        int ans2=operate(q1[5],q1[7],q2[6]);
        if(ans2==-10)return ;
        int ans=operate(ans1,ans2,q2[4]);
        if(ans==24)
        {
            printf("((%d%c%d)%c(%d%c%d))",q1[1],hash[q2[2]],q1[3],hash[q2[4]],q1[5],hash[q2[6]],q1[7]);
            exit(0);
        }
    }
    else
    if(o)
    {
        for(int i=1;i<=4;i++)
        if(!used[i])
        {
            q1[u]=n[i];
            used[i]=1;
            dfs2(u+1,!o);
            used[i]=0;
        }
    }
    else
    {
        for(int i=1;i<=4;i++)
        {
            q2[u]=i;
            dfs2(u+1,!o);
        }
    }
}

亲手打的,懒得标注了

题目描述

在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界。必须等一个油滴扩展完毕才能放置下一个油滴。那么应该按照怎样的顺序在这N个点上放置油滴,才能使放置完毕后所有油滴占据的总体积最大呢?(不同的油滴不会相互融合)

注:圆的面积公式V=pi*r*r,其中r为圆的半径。

输入输出格式

输入格式:

第1行一个整数N。

第2行为长方形边框一个顶点及其对角顶点的坐标,x,y,x’,y’。

接下去N行,每行两个整数xi,yi,表示盒子的N个点的坐标。

以上所有的数据都在[-1000,1000]内。

输出格式:

一行,一个整数,长方形盒子剩余的最小空间(结果四舍五入输出)

输入输出样例

输入样例#1: 复制
2
20 0 10 10
13 3
17 7
输出样例#1: 复制
50

因为没有单独讨论油滴在另一个油滴扩展的圆内的情况,这种情况就不能扩展,不单独讨论会变成负面积


#include
using namespace std;
double dis[10][10],x,y,x2,y2,a[10][4];//a为点的坐标,1为横坐标,2为纵坐标,dis油滴间距
double R[100],r,maxn;//r为准备放置的油滴的扩散半径 ,maxn是最大油面积
int vis[100],n;//vis判断是否走过
const double pi=acos(-1);
void dfs(int steps,double s)//steps位当前步数,s为当前面积
{
    if(steps==n+1)//油滴放完了
    {  //更新最大值
    if(s>maxn) maxn=s;}
    else
        for(int k=1;k<=n;k++)
            if(!vis[k])//如果没拜访过
            {
                //矩形和已放置的油滴约束了r的大小 //fabs绝对值函数可以计算浮点数,好像abs不行
                r=fabs(y2-a[k][2]);//纵坐标边框限制
                //找到所有限制下的最小半径
                if(r>fabs(y-a[k][2]))r=fabs(y-a[k][2]);//另一边
                if(r>fabs(x2-a[k][1]))r=fabs(x2-a[k][1]);//其他边框
                if(r>fabs(x-a[k][1]))r=fabs(x-a[k][1]);//还是边
                for(int i=1;i<=n;i++)
                {
                    if(vis[i])//如果拜访过了
                        if(r>dis[k][i]-R[i])r=dis[k][i]-R[i];//其他油滴限制,油滴距离减去已存半径
                }
                r=r<0?0:r; //r不能为负 
                R[k]=r;//记录半径
                //搜索模板
                vis[k]=1;
                dfs(steps+1,s+pi*r*r);
                vis[k]=0;
                R[k]=0.0;
            }
}
int main()
{
    scanf("%d%lf%lf%lf%lf",&n,&x,&y,&x2,&y2);
    for(int i=1;i<=n;i++)scanf("%lf%lf",&a[i][1],&a[i][2]);
        //预处理出油滴间距dis 
    for(int i=1;i<=n;i++)  
    {
        for(int j=1;j<=i;j++)
        {
            dis[i][j]=sqrt(pow(fabs(a[i][1]-a[j][1]),2)+pow(fabs(a[i][2]-a[j][2]),2));//油滴i和油滴j之间的间距,距离公式
            dis[j][i]=dis[i][j];//i到j的距离就是j到i的距离
        }
    }
    double S=fabs(x-x2)*fabs(y-y2);//矩形面积 
    dfs(1,0.0);
    printf("%.0lf",floor(S-maxn+0.5));
    return 0;
}


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。 ... [详细]
author-avatar
ZZDXP
学 無
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有