排序用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<stdioh>#include<mathh>
#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",&H);
while(!(H<1001&&H>0))
{
printf("圆柱体的高必须是0到1001之间,请重新输入:");
scanf("%d",&H);
}
printf("请输入圆柱体的直径D:");
scanf("%d",&D);
while(!(D<1001&&D>0))
{
printf("圆柱体的直径必须是0到1001之间,请重新输入:");
scanf("%d",&D);
}
printf("请输入绳子长度L:");
scanf("%d",&L);
while(!(L<1001&&L>0&&L<H))
{
printf("绳子的长度必须是0到1001之间,并且比大圆的高H要小请重新输入:");
scanf("%d",&L);
}
printf("请输入小圆直径d:");
scanf("%d",&d);
while(!(d<1001&&d>0&&d<D))
{
printf("圆环半径必须是0到1001之间,并且比大圆D要小请重新输入:");
scanf("%d",&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->d=c;L=d;
}
bool circle::barea()
{
if(L/H < 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大赛试题!进来看补充有题目!写下注释!谢谢!求帮助!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)