c语言搭梯子问题
本帖最后由 ksdeer 于 2019-10-15 16:46 编辑题目在最下面的图片。
思路:木桶短板效应。第二长的木板决定了梯子的阶梯数。
#include <stdio.h>
int main(void)
{
int t;
scanf("%d", &t);
while(t--)
{
int n;
scanf("%d", &n);
int changdu;
for(int j = 0; j < n; j++)
{
scanf("%d", &changdu);
}
if(n <= 2)
{
printf("%d\n", 0);
continue;
}
//求出第二长的木棍
int max = changdu;
int second = changdu;
for(int i = 0;i < n;i++)
{
if(changdu >= max)
{
second = max;
max = changdu;
}
else if(changdu <= max && changdu >= second)
{
second = changdu;
}
}
//开始求最大阶梯数
int k;
if(second >= n - 1)
{
printf("%d\n", n - 2);
continue;
}
else
{
for(k = 1; k <= n - 2; k++)
{
if(second >= k + 1)
{
continue;
}
else
{
printf("%d\n", k - 1);
break;
}
}
}
}
return 0;
}
这个代码似乎有点问题。希望有人可以帮忙解决一下。谢谢 本帖最后由 matrixgadener 于 2019-10-20 00:36 编辑
#include <stdio.h>
#include<stdlib.h>
void swap(float &a, float &b);
void print_f(float *L, int n);
int main(void)
{
int n;
scanf("%d", &n);
float *changdu=NULL;
changdu=(float*)malloc(n*sizeof(float));
for (int j = 0; j < n; j++)
{
scanf("%f", &changdu);
}
printf("输入 %d 个木条\n",n);
printf("长度分别是:");
print_f(changdu,n);
printf("\n");
// if (n <= 2)
// {
// printf("%d\n", 0);
// continue;
// }
// //求出第二长的木棍
// int max = changdu;
// int second = changdu;
// for (int i = 0; i < n; i++)
// {
// if (changdu >= max)
// {
// second = max;
// max = changdu;
// }
// else if (changdu <= max && changdu >= second)
// {
// second = changdu;
// }
// }
// //开始求最大阶梯数
// int k;
// if (second >= n - 1)
// {
// printf("%d\n", n - 2);
// continue;
// }
// else
// {
// for (k = 1; k <= n - 2; k++)
// {
// if (second >= k + 1)
// {
// continue;
// }
// else
// {
// printf("%d\n", k - 1);
// break;
// }
// }
// }
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
{
if(changdu<changdu)
swap(changdu,changdu);
}
}
printf("排序后长度:");
print_f(changdu,n);
printf("\n");
float second=changdu;
printf("第二长的长度是 %.3f\n",second);
int k_count=0;
//int k_count_=
for(i=2;i<n;i++)
{
if(second-1>changdu && changdu>=1)
k_count++;
}
printf("最终能搭的梯子数:%d\n",(k_count<(int)(second-1))?k_count:(int)(second-1));
free(changdu);
return 0;
}
void swap(float &a, float &b)
{
a=a-b;
b=b+a;
a=b-a;
return;
}
void print_f(float *L, int n)
{
for(int i=0;i<n;i++)
{
printf("%.3f ",*(L+i));
}
}
这是修改后的代码,不过我把长度输入看成float了,你得改一下
这里用到C语言的动态数组申请和释放,还有简单排序算法。
求第二长的代码你得再看一下,最后求梯子数的代码思路不太对,应该是比较“第二长-1”和“比第二长短到1之间”,这两个数较小的那个数才是答案,下面是我用的测试数据:
7
3.5 3 2.5 2 1.5 1 0.5
7
2 1.5 1 0.5 3.5 3 2.5
8
2 1.5 0.5 1 4.5 4 2.5 0.5
8
2 1.5 1.5 0.5 5 5 2.5 0.5
8
2 1.5 1.5 1.5 5 5 2.5 0.5
你可以看下还有没有问题,我大概解决了下 求助! 。。。。。没人吗 大神这问题有点难度
页:
[1]