3.21小题总结

第一题:生日蛋糕

题解:这题是蛋糕结构是一层一层的,估计很多人很快就能想到是dfs,但是这题的难想的点在于

你每层的状态该怎么去确定,你怎么来确定每层的半径和高度是多少,一开始我也不知很理解,直到在网上看到了一篇大佬的博客才让我茅塞顿开,我干嘛非要确定呢,全用最小的不就好了,因此我们要写出每层的最小的体积和面积,然后用前缀和累加起来,然后三个剪枝(代码里有注释)减少运算,就可以愉快的AC了

#include<iostream>
#include<cstring>
#include<cstdio>
#include <queue>
#include<math.h>
using namespace std;
int n,m;
int sums[16];
int sumv[16];
int sum=0x7fffffff;//记录最小的值 

void dfs(int t,int s,int v,int r,int h)
{
	if(t==0)
	{
		if(s<sum&&v==n)
		{
			sum=s;
		}
		return ;
	}
	if(s+sums[t]>sum)//第一个剪枝,你目前的面积,加上上面层的最小的面积>已知面积,可以直接跳过
	return ;
	if(v+sumv[t]>n)//第二个剪枝,你目前的体积,加上上面层的最小的体积>要求的体积,可以直接跳过
	return ;
	if(s+2*(n-v)/r>sum)//第三个剪枝,你把所有体积都做成一层蛋糕,如果面积>已知面积,跳过
	return ;
	for(int i=r-1;i>=t;i--)
	{
		if(t==m)
		s=i*i;
		int h1=min(h-1,(n-v-sumv[t-1])/(i*i));
		for(int j=h1;j>=t;j--)
		{
			dfs(t-1,s+2*i*j,v+i*i*j,i,j);
		}
	}
	return ;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		sumv[i]+=sumv[i-1]+i*i*i;
		sums[i]+=sums[i-1]+2*i*i;
	}
	dfs(m,0,0,sqrt((double)n)+1,n);
	if(sum==0x7fffffff)
	{
		printf("0");
		return 0;
	}
	printf("%d",sum);
	return 0;
}

第二题:速算24

题解:这题一开始也卡了我好久,我一直不明白哪里错了,后面问了学长,但是还是自己想出来为什么错了,因为有可能二三进行运算,这样的话,就会漏掉情况,所以一开始一直过不了,然后写出来了,还用到了全排列函数(不会的可以去了解一下),AC代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
 
char s[5]={0};
int num[5]={0};
int flag=0;
 
 
void dfs(int sum,int count,int nextt)
{
	if(flag==1)
	return ;
	if(count==3)
	{
		if(sum+nextt==24)
		flag=1;
		if(sum-nextt==24)
		flag=1;
		if(sum*nextt==24)
		flag=1;
		if(nextt!=0&&sum%nextt==0&&sum/nextt==24)
		flag=1;
		return ;
	}
	   
   dfs(sum+nextt,count+1,num[count+1]);
   dfs(sum-nextt,count+1,num[count+1]);
   dfs(sum*nextt,count+1,num[count+1]);
   if(nextt!=0&&sum%nextt==0)
   {
     dfs(sum/nextt,count+1,num[count+1]);
   }
   dfs(sum,count+1,nextt+num[count+1]);
   dfs(sum,count+1,nextt-num[count+1]);
   dfs(sum,count+1,nextt*num[count+1]);
   if(num[count+1]!=0&&nextt%num[count+1]==0)
   {
     dfs(sum,count+1,nextt/num[count+1]);
   }
//	dfs(sum+nextt,count+1,num[count+1]);
//	dfs(sum-nextt,count+1,num[count+1]);
//	dfs(sum*nextt,count+1,num[count+1]);
//	if(sum%nextt==0&&nextt!=0)
//	{
//		dfs(sum/nextt,count+1,num[count+1]);
//	}
//	dfs(sum,count+1,nextt+num[count+1]);
//	dfs(sum,count+1,nextt-num[count+1]);
//	dfs(sum,count+1,nextt*num[count+1]);
//	if(nextt%num[count+1]==0&&num[count+1]!=0)
//	{
//		dfs(sum,count+1,nextt/num[count+1]);
//	}
}
 
 
 
 int main()
{

    while (~scanf("%s", s))
    {
        flag = 0;
        if (strlen(s) == 2)
            num[0] = 10;
        else
        {
            if (s[0] == 'A')
                num[0] = 1;
            else if (s[0] == 'J')
                num[0] = 11;
            else if (s[0] == 'Q')
                num[0] = 12;
            else if (s[0] == 'K')
                num[0] = 13;
            else
                num[0] = s[0] - '0';
        }
        for (int i = 1; i < 4; i++)
        {
            scanf("%s", s);
            if (strlen(s) == 2)
                num[i] = 10;
            else
            {
                if (s[0] == 'A')
                    num[i] = 1;
                else if (s[0] == 'J')
                    num[i] = 11;
                else if (s[0] == 'Q')
                    num[i] = 12;
                else if (s[0] == 'K')
                    num[i] = 13;
                else
                    num[i] = s[0] - '0';
            }
        }
        flag=0;
       sort(num,num+4);
       do
       {
       	 dfs(num[0],1,num[1]);
	   }
	   while(next_permutation(num,num+4)&&flag==0);
        if (flag == 1)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/477358.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算结构体的大小(结构体的内存对齐)

一&#xff1a;问题 问题所在&#xff1a;两个结构体应该都是6个字节大小&#xff0c;为什么一个12&#xff0c;一个6&#xff1f;&#xff1f;&#xff1f; 二&#xff1a;如何正确的计算结构体大小&#xff1f; 首先得掌握结构体的对齐规则&#xff1a; 第一&#xff1a; 第一…

Leetcode 994. 腐烂的橘子

心路历程&#xff1a; 一开始以为和刚做过的岛屿问题很像&#xff0c;只不过是把岛屿问题换成BFS去做&#xff0c;然后再加上一些计数的规则。结果做完后发现只能通过一半左右的测试用例&#xff0c;发现有一个逻辑错误在于&#xff0c;当腐烂的橘子位于两端时&#xff0c;可以…

约数(因数)问题(ACwing算法笔记)

869.试除法求约数 注意点&#xff1a; 1.试除法就是让i遍历的最大值到a/i。 2.约数成对存在&#xff0c;只遍历前一部分即可。 代码&#xff1a; #include<iostream> #include<queue> #include<algorithm> #include<cstring> #include<cmath>…

Go语言学习04~05 函数和面向对象编程

Go语言学习04-函数 函数是一等公民 <font color"Blue">与其他主要编程语言的差异</font> 可以有多个返回值所有参数都是值传递: slice, map, channel 会有传引用的错觉函数可以作为变量的值函数可以作为参数和返回值 学习函数式编程 可变参数 func s…

刷题28-30(力扣0322/0078/0221)

0322. 零钱兑换 题目&#xff1a; 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。你可以…

LLM - 大语言模型的分布式训练 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/136924304 大语言模型的分布式训练是一个复杂的过程&#xff0c;涉及到将大规模的计算任务分散到多个计算节点上。这样做的目的是为了处…

java面试:常见的限流算法有哪些

1 什么是限流算法 限流算法是一种用于限制流量请求的频率或速率的算法&#xff0c;其目的是在高并发或大流量请求的情况下&#xff0c;保护系统服务的安全性和可用性。限流算法可以应对热点业务带来的突发请求、调用方bug导致的突发请求以及恶意攻击请求等情况。是一种系统保护…

10W字解析 SpringBoot技术内幕文档,实战+原理齐飞,spring事务实现原理面试

第3章&#xff0c;Spring Boot构造流程源码分析&#xff0c;Spring Boot的启动非常简单&#xff0c;只需执行一个简单的main方法即可&#xff0c;但在整个main方法中&#xff0c;Spring Boot都做了些什么呢&#xff1f;本章会为大家详细讲解Spring Boot启动过程中所涉及的源代码…

《深入解析 C#》—— C# 3 部分

文章目录 第三章 C#3&#xff1a;LINQ及相关特性3.1 自动实现属性&#xff08;*&#xff09;3.2 隐式类型 var&#xff08;*&#xff09;3.3 对象和集合初始化3.3.1 对象初始化器3.3.2 集合初始化器 3.4 匿名类型3.4.1 基本语法和行为3.4.2 编译器生成类型3.4.3 匿名类型的局限…

Linux信号补充——信号捕捉处理

一、信号的捕捉处理 ​ 信号保存后会在合适的时间进行处理&#xff1b; 1.1信号处理时间 ​ 进程会在操作系统的调度下处理信号&#xff0c;操作系统只管发信号&#xff0c;即信号处理是由进程完成的&#xff1b; ​ 1.信号处理首先进程得检查是否有信号&#xff1b;2.进程…

双指针(对撞指针、快慢指针)

本博客将讲述OJ题中的常用的双指针 双指针的含义 双指针算法是一种常用的算法技巧&#xff0c;它通常用于在数组或字符串中进行快速查找、匹配、排序或移动操作。 双指针并非真的用指针实现&#xff0c;一般用两个变量来表示下标&#xff08;在后面都用指针来表示)。双指针算…

QML TextField 默认无法鼠标选中内容

1.import QtQuick.Controls 2.0 后的TextField默认无法选中内容如下图&#xff1a; 2.增加属性设置 selectByMouse: true 可以选中内容了 TextField{ selectByMouse: true text:"1234567890987654321" } 效果如下:

多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)

JUC Java.util.concurrent 包, 存放了并发编程相关的组件, 目的是更好的支持高并发任务 (多线程只是实现并发编程的一种具体方式 …) ReentrantLock 可重入互斥锁, 和 synchronized 定位类似, 用来实现互斥效果, 保证线程安全. synchronized 对对象加锁, 保护临界资源Reentreat…

面向量产!基于视觉的速度距离估计

面向量产&#xff01;基于视觉的速度距离估计 论文名称&#xff1a;Vision-based Vehicle Speed Estimation: A Survey 导读 在精确检测车速车距的方案中&#xff0c;视觉方案是非常具有挑战性的&#xff0c;但由于没有昂贵的距离传感器而大幅降低成本&#xff0c;所以潜力巨…

【现代C++】范围基于的for循环

现代C中的范围基于的for循环&#xff08;range-based for loop&#xff09;是C11引入的一项特性&#xff0c;旨在简化对容器或范围的迭代过程。这种循环语法不仅使代码更清晰易读&#xff0c;还减少了迭代时的错误。以下是范围基于的for循环的详细介绍&#xff1a; 1. 基本用法…

Vue3的与2的简单区别

Vue2选项式api Vue3组合式API setup方法的使用&#xff0c;最后需要return setup语法糖省略了内部的export default{} 和return 内容 以及组件的注册 reactive生成响应式对象&#xff0c;只能适用于复杂对象&#xff0c;简单类型不可 ref生成响应式数据&#xff1a;复杂类型和简…

leetcode 数组练习,美团优选面试题java

public int maxSubArray(int[] nums) { int countnums[0]; int resnums[0]; for(int i1;i<nums.length;i){ if(count<0){ countnums[i]; }else{ countnums[i]; } resMath.max(res,count); } return res; } 3、两数之和 利用map,来存储数组值和当前位置&…

【Review】电动汽车百人会

汽车强国靠四化--电动化、智能化、低碳化、全球化。 1.坚持电动化&#xff1a;电动化是经过二十多年反复论证的既定战略和技术路线、不能动摇、无需改变、要将电动化进行到底&#xff0c;全力攻克下一代电动化核心技术--全固态锂电池;市场方面要采用“双轮”驱动战略一方面继续…

基于PID控制器的四旋翼无人机控制系统的simulink建模与仿真,并输出虚拟现实动画

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1四旋翼无人机的动力学模型 4.2 PID控制器设计 4.3 姿态控制实现 4.4 VR虚拟现实动画展示 5.完整工程文件 1.课题概述 基于PID控制器的四旋翼无人机控制系统的simulink建模与仿真,并输出vr虚拟现实…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(四)—— 过拟合和欠拟合

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 通过增加容量或提前停止来提高性能。 在深度学习中&#…