Cylinder(圆柱体)(枚举)

http://acmore.net/problem.php?id=1525

1525: Cylinder(圆柱体)

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 14  Solved: 4

Submit

Status

Web Board

Description

使用剪刀和一张纸,根据下面的步骤,可以剪出两个面来形成一个圆柱体:

1 平行于最短边把纸剪成两个长方形;

2 在第一长方形上,剪一个具有最大半径的圆,这个圆形成圆柱体的底.

3 卷起第二个长方形,使它的周长等于上一步骤中圆的周长 ,并把圆桶的一端与圆粘在一起.(为了使卷起的圆桶的周长等于圆的周长,它可以有重叠的部分).给出纸张的宽度和高度,你能计算出通过上述方法做出的圆柱体的最大体积吗?

Input

输入包含几个测试用例,每一个测试用例包含两个数w and h (1 ≤ w ≤ h ≤ 100),表示纸张的宽度和高度,最后一个测试用例后有两个0. 

Output

对每一个测试用例,打印一行最大可能的圆柱体体积,通过四舍五入保留三个小数

Sample Input

10 10 10 50 10 30 0 0

Sample Output

54.247 785.398 412.095

HINT

 PI = 3.141593

Source

Submit

Status

Web Board

Anything about the Problems, Please Contact Admin:admin 

解析:谁知道我一看到这道题就马上想到了数学里的函数求最大值来着。还列列了方程求导,求根等等,越想越烦琐。最后把这最简单的一道题目给错过了

其实只要枚举一下情况就可以了

                             h-2*r1

     情况一     w      w

r1=min(w/2.0,h/(2*pi+2));v1=pi*r1*r1*wl;

     情况二              h-2*r2

               w

    r2=w/(2*pi) ,v2=pi*r2*r2*(h-2*r2);             

  //wronganswer:错的原因是因为题目没有看清楚,我把两种切法都考虑进去了,而题目只要求第一种切法

#include <stdio.h>

#include <math.h>

#include <algorithm>

#include <assert.h>

using namespace std;

const double pi= 2.0*acos(0.0);

double max(double a,double b)

{

    return a>b? a:b;

}

double min(double a,double b)

{return a<b? a:b;

}

double volume(double r,double h)

{

    return pi*r*r*h;

}

int main()

{freopen("in.txt","r",stdin);

 freopen("out.txt","w",stdout);

    double w,h;

    double r1,r2,v1,v2,t;

    while(scanf("%lf%lf",&w,&h)!=EOF)

    {  if(w==0&&h==0)

        break;

        //r1=min(h/(2.0*pi+2.0),w/2.0);//竖切

        v1=volume(r1,w);

        r2=w/(2.0*pi);

        v2=volume(r2,h-2.0*r2);

        //printf("r1=%.3lf v1=%.3lf,r2=%.3lf,v2=%.3lf\n",r1,v1,r2,v2);

        t=max(v1,v2);

        r1=w/(2.0*pi+2.0);//横切

        v1=volume(r1,h);

        r2=h/(2.0*pi);

        v2=volume(r2,w-2.0*r2);

       // printf("r1=%.3lf v1=%.3lf,r2=%.3lf,v2=%.3lf\n",r1,v1,r2,v2);

        t=max(t,max(v1,v2));

        printf("%.3lf\n",t);

    }

    return 0;

}

//accept

#include <stdio.h>

#include <math.h>

#include <algorithm>

#include <assert.h>

using namespace std;

const double pi= 2.0*acos(0.0);

double max(double a,double b)

{

    return a>b? a:b;

}

double min(double a,double b)

{return a<b? a:b;

}

double volume(double r,double h)

{

    return pi*r*r*h;

}

int main()

{

    double w,h;

    double r1,r2,v1,v2,t;

    while(scanf("%lf%lf",&w,&h)!=EOF)

    {  if(w==0&&h==0)

        break;

        r1=min(h/(2.0*pi+2.0),w/2.0);//竖切,即沿着h处切

        v1=volume(r1,w);

        r2=w/(2.0*pi);

        v2=volume(r2,h-2.0*r2);

        printf("%.3lf\n",t);

    }

    return 0;

}

using UnityEngine; using UnityEngine.ProBuilder; // 必需命名空间 using UnityEngine.ProBuilder.MeshOperations; // 形状操作命名空间 [RequireComponent(typeof(LineRenderer))] // 自动添加LineRenderer组件 public class PathCylinderGenerator : MonoBehaviour { [Range(0.1f, 2f)] public float radius = 0.2f; // 圆柱半径 public int subdivisions = 8; // 圆柱细分度 void Start() { // 获取当前物体的LineRenderer组件 LineRenderer lineRenderer = GetComponent<LineRenderer>(); // 创建位置数组(建议最大1024个点) Vector3[] path = new Vector3[lineRenderer.positionCount]; lineRenderer.GetPositions(path); // 创建圆柱参数 CylinderParameters parameters = new CylinderParameters { height = CalculatePathLength(path), // 使用实际路径长度 radius = this.radius, axisDivisions = this.subdivisions, heightSegments = 4 // 推荐的基础分段数 }; // 生成ProBuilder圆柱体 ProBuilderMesh cylinder = ProBuilderMesh.Create( ProBuilderShape.Cylinder, parameters ); // 设置位置和旋转 cylinder.transform.SetPositionAndRotation( CalculateCenterPoint(path), // 自动居中 Quaternion.Euler(90, 0, 0) // 旋转Z轴对齐 ); // 应用顶点位置(重要!) cylinder.SetPositions(path); cylinder.ToMesh(); // 生成实际网格 cylinder.Refresh(); // 刷新显示 } // 计算路径总长度 float CalculatePathLength(Vector3[] path) { float length = 0f; for (int i = 1; i < path.Length; i++) { length += Vector3.Distance(path[i - 1], path[i]); } return length; } // 计算路径中心点 Vector3 CalculateCenterPoint(Vector3[] path) { Vector3 sum = Vector3.zero; foreach (Vector3 point in path) { sum += point; } return sum / path.Length; } }严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息 错误 CS0246 未能找到类型或命名空间名“CylinderParameters”(是否缺少 using 指令或程序集引用?) Assembly-CSharp E:\Unity3DWrok\NanNing\Assets\Script\材质\管线\管线\NewBehaviourScript.cs 21 活动 ,严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息 错误 CS0103 当前上下文中不存在名称“ProBuilderShape” Assembly-CSharp E:\Unity3DWrok\NanNing\Assets\Script\材质\管线\管线\NewBehaviourScript.cs 31 活动 ,严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息 错误 CS1061 “ProBuilderMesh”未包含“SetPositions”的定义,并且找不到可接受第一个“ProBuilderMesh”类型参数的可访问扩展方法“SetPositions”(是否缺少 using 指令或程序集引用?) Assembly-CSharp E:\Unity3DWrok\NanNing\Assets\Script\材质\管线\管线\NewBehaviourScript.cs 42 活动,代码修改之后整合一下,让我直接复制就可以
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值