ACM题 关于n个数据,最后选出3个构成三角形,要求边长最大

ACM题 关于n个数据,最后选出3个构成三角形,要求边长最大,第1张

排序用sort就好了……你的排序要确定是从大到小排的

然后看一下主算法。你的算法是O(n^3)的,对于n=100000的数据,肯定严重超时。

对于n=100000的数据,必须用O(nlogn)以下级别的算法解决。 这个题是贪心,不是搜索。

说一下思路。

先从大到小排序,然后取最大的三条边判断三角形的条件。如果不能,则用第2大、第3大、第4大的三条边判断,如果还不行就用用第3大、第4大、第5大的三条边判断。什么时候可以了,三边之和就是要的周长最大值。

证明:

假设我有一个从大到小排好序的数组a[0n-1] 对于最大的三条边,如你所说,这里判断三角形的唯一条件就是a[0]<a[1]+a[2] 如果它不成立即a[0]>=a[1]+a[2],则对于任何i,j, (i>=1, j>=2, i≠j), 有a[1]>=a[i], a[2]>=a[j],因此a[0]>=a[i]+a[j] 换句话说,如果最大的一条边不能跟第二大、第三大的两条边组成三角形,就一定不能与其他边组成三角形。因此这个最大边就应该被舍弃(想象这根棍子被扔了)。在剩下的n-1个棍子里的最大的三条边继续上面的算法,直到找到符合条件的三角形为止。证毕。

while(scanf("%d",&n)&&n!=0)

改为while(scanf("%d",&n)!=EOF&&n!=0)

还有,你的程序基本不对,又不是只有6种颜色(真不知道你这六种颜色从哪里弄来的,前面五个你是从样例里面摘过来的,还添加了一个"black"),这个程序基本不可改了,最好还是重写一个吧。

求**这块面积是吧

首先进行一个判断

L/H>=d/D,那么顶面完全黑暗;然后开始着手部分被照亮的情况。

已经知道的是圆柱体侧面积为DpiH;

顶部面积为 D^2/4pi

阴影部分面积:d^2/4pi(H/(H-L))^2        前提L/H <= d/D

我先带入算一下是不是284:

侧面积=DpiH=276;

顶部面积=D^2/4pi=50;

阴影部分面积:d^2/4pi(H/(H-L))^2=42;

经过计算276+50-42=284;理论正确之后我们开始加入代码:

#include&lt;stdioh&gt;

#include&lt;mathh&gt;

#define pi 314

struct circle

{

int H,D,d,L;//定义好4个数据

int Bigarea();//顶部圆面积

int smallarea();//阴影面积

int cearea();//圆柱侧面积

bool barea();//直接测试阴影是否全部挡住了顶部

circle()

{

H=0;D=0;d=0;L=0;

}//构造函数

void setcircle(int,int,int,int);

};

int main()

{

circle A;//创建类A

int H,D,L,d;

printf("请输入圆柱体的高H:");

scanf("%d",&amp;H);

while(!(H&lt;1001&amp;&amp;H&gt;0))

{

printf("圆柱体的高必须是0到1001之间,请重新输入:");

scanf("%d",&amp;H);

}

printf("请输入圆柱体的直径D:");

scanf("%d",&amp;D);

while(!(D&lt;1001&amp;&amp;D&gt;0))

{

printf("圆柱体的直径必须是0到1001之间,请重新输入:");

scanf("%d",&amp;D);

}

printf("请输入绳子长度L:");

scanf("%d",&amp;L);

while(!(L&lt;1001&amp;&amp;L&gt;0&amp;&amp;L&lt;H))

{

printf("绳子的长度必须是0到1001之间,并且比大圆的高H要小请重新输入:");

scanf("%d",&amp;L);

}

printf("请输入小圆直径d:");

scanf("%d",&amp;d);

while(!(d&lt;1001&amp;&amp;d&gt;0&amp;&amp;d&lt;D))

{

printf("圆环半径必须是0到1001之间,并且比大圆D要小请重新输入:");

scanf("%d",&amp;d);

}

printf("确认:您输入的数据为:圆柱高度%d,底面直径:%d, 绳子长度:%d ,小圆直径:%d\n",H,D,L,d);

Asetcircle(H,D,d,L);

if ( Abarea())

{

int mianji=ABigarea()+Acearea()-Asmallarea();

printf("您输入的数据处理结果为:%d",mianji);

}

else

{

printf("您输入的数据处理结果为:顶部完全被阴影所遮挡住了!\n");

}

}

int circle::Bigarea()

{

return (D/2)(D/2)pi;

}

int circle::smallarea()

{

return (d/2)(d/2)piHH/(H-L)/(H-L);

}

int circle::cearea()

{

return piDH;

}

void circle::setcircle(int a,int b,int c,int d)

{

H=a;D=b;this-&gt;d=c;L=d;

}

bool circle::barea()

{

if(L/H &lt; d/D)

return true;

else

return false;

}本来想在修改一下,结果已经提交的代码不能改,你先复制过去运行一下看看,我都已经注释了、

ACM题目:

Feli的生日礼物Problem

Felicia的生日是11月1日(和Kitty是同一天生的哦)。于是Feli请来Kitty一起过生日。Kitty带来了最新款的“Kitty猫”玩具准备送给Feli,不过她说,这份礼物可不是白送的。Feli要帮她一个忙,才能够得到心仪已久的玩具。 Kitty说,“Kitty猫”玩具已经卖出了n!个,n<=10^100 _,Kitty想知道确切的数字,而不是无聊的“一个数加个感叹号”。 Feli听了大吃一惊。要知道,算出n!是一个无比艰巨的任务。Feli告诉Kitty,就算Feli算出n!,Kitty也看不下去,因为当n=20时,计算机的长整型已经存不下了(Kitty只能接受1-9之间的数字)。于是Kitty说,你只要告诉我n!最后一位非0的数就可以了。Feli想了想,立刻动手写了个程序算出了正确的答案。现在,请你也试试看!注意哦,AC的男生将会得到一个“Hello Kitty”计算器(可编程,CPU 1THz,Mem 1TMB),AC的女生将会得到一个仿真“Hello Kitty”宠物(善解人意,无须喂养,智商1101,附带写情书功能)。

Input

每行一个n,直到输入数据结束

Output

对应输入的n,每行输出一个答案

Sample Input

1101

Sample Output

8

以上就是关于ACM题 关于n个数据,最后选出3个构成三角形,要求边长最大全部的内容,包括:ACM题 关于n个数据,最后选出3个构成三角形,要求边长最大、c语言 ACM一题、C语言程序设计题目!求高手!2012年广东省ACM大赛试题!进来看补充有题目!写下注释!谢谢!求帮助!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10122790.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存