|
20鱼币
本帖最后由 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[n];
- for(int j = 0; j < n; j++)
- {
- scanf("%d", &changdu[j]);
- }
- if(n <= 2)
- {
- printf("%d\n", 0);
- continue;
- }
- //求出第二长的木棍
- int max = changdu[0];
- int second = changdu[1];
- for(int i = 0;i < n;i++)
- {
- if(changdu[i] >= max)
- {
- second = max;
- max = changdu[i];
- }
- else if(changdu[i] <= max && changdu[i] >= second)
- {
- second = changdu[i];
- }
- }
- //开始求最大阶梯数
- 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[j]);
- }
- printf("输入 %d 个木条\n",n);
- printf("长度分别是:");
- print_f(changdu,n);
- printf("\n");
-
- // if (n <= 2)
- // {
- // printf("%d\n", 0);
- // continue;
- // }
- // //求出第二长的木棍
- // int max = changdu[0];
- // int second = changdu[1];
- // for (int i = 0; i < n; i++)
- // {
- // if (changdu[i] >= max)
- // {
- // second = max;
- // max = changdu[i];
- // }
- // else if (changdu[i] <= max && changdu[i] >= second)
- // {
- // second = changdu[i];
- // }
- // }
- // //开始求最大阶梯数
- // 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[i]<changdu[j])
- swap(changdu[i],changdu[j]);
- }
- }
- printf("排序后长度:");
- print_f(changdu,n);
- printf("\n");
- float second=changdu[1];
- printf("第二长的长度是 %.3f\n",second);
- int k_count=0;
- // int k_count_=
-
- for(i=2;i<n;i++)
- {
- if(second-1>changdu[i] && changdu[i]>=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
你可以看下还有没有问题,我大概解决了下
|
-
最佳答案
查看完整内容
这是修改后的代码,不过我把长度输入看成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 ...
|