鱼C论坛

 找回密码
 立即注册
查看: 1758|回复: 10

谁能看出规律

[复制链接]
发表于 2016-12-13 08:00:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
B  缩小三角形
Time Limit:1000MS  Memory Limit:65535K
题型: 编程题   语言: 无限制
描述
刚接触算法的Gsh遇到了一道难题。给你一个边长为n的等边三角形,然后你可以对三角形进行如下操作:每次减少一条边的长度,但是要保证这三

条边还是能构成三角形。现在要求你把三角形缩小为边长为m的等边三角形,请问最少需要花多少步。Gsh想了很久都没想出来,你能帮帮他吗?


输入格式
输入两个数字n和m, (3&#8201;≤&#8201;m&#8201;<&#8201;n ≤&#8201;100&#8201;000)
注意题目是多case输入,输入格式为while(scanf("%d%d",&n,&m)>0){.....}(case数不超过100)


输出格式
输出一个整数,代表最少花费步数,每个case输出一行
输入样例
6 3
8 5
4 3
61 3
输出样例
4
3
3
9
Hint
一开始三角形的边长是(6,6,6),然后变成(6,6,3)->(6,4,3)->(3,4,3)->(3,3,3),一共花费了4步
61到3只用9步我愣是无法写出过程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-12-13 12:14:23 | 显示全部楼层
急了,!研究一天了,还是没办法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-13 17:38:23 | 显示全部楼层
自行AC了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-13 18:02:26 | 显示全部楼层
我也写完了,你也解决了^_^
既然解决了,那就帮我看看我写的对不对
无标题.png
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. long reduce_triangle(long n, long m)
  4. {
  5.         long a = n;
  6.         long b = n;
  7.         long c = n;
  8.         long ret = 0;

  9.         if(!((3 <= m) && (m < n) && (n <= 100000)))
  10.         {
  11.                 return -1; //不符合条件
  12.         }

  13.         c = m;
  14.         ret++;

  15.         while((a != b) || (a != c) || (b != c))
  16.         {
  17.                 b = m;
  18.                 while((b + c <= a) || (b + a <= c) || (a + c <= b))
  19.                 {
  20.                         b++;
  21.                 }
  22.                 ret++;

  23.                 if((a == b) && (a == c) && (b == c))
  24.                 {
  25.                         break;
  26.                 }

  27.                 a = m;
  28.                 while((b + c <= a) || (b + a <= c) || (a + c <= b))
  29.                 {
  30.                         a++;
  31.                 }
  32.                 ret++;
  33.         }
  34.        

  35.         return ret;
  36. }

  37. int main()
  38. {
  39.         int n, m;

  40.         printf("请输入n和m:");

  41.         while(scanf("%d%d", &n, &m) > 0)
  42.         {
  43.                 printf("%ld\n", reduce_triangle(n, m));
  44.                
  45.         }

  46.         return 0;
  47. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-15 16:37:39 | 显示全部楼层
人造人 发表于 2016-12-13 18:02
我也写完了,你也解决了^_^
既然解决了,那就帮我看看我写的对不对

错了哦,告诉当时我苦思冥想想不出来别人给我说的两个字 “逆推”,没错他只说了两个字就不鸟我,而我也顿悟了弄不懂在我问我哈,有上就回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-15 16:44:56 | 显示全部楼层
honhon 发表于 2016-12-15 16:37
错了哦,告诉当时我苦思冥想想不出来别人给我说的两个字 “逆推”,没错他只说了两个字就不鸟我,而我也 ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-18 11:09:35 | 显示全部楼层
我也写了这个程序,可就是不明白错在哪,可以求教一下吗?贴下代码或者给下思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-18 16:48:41 | 显示全部楼层
horn0603 发表于 2016-12-18 11:09
我也写了这个程序,可就是不明白错在哪,可以求教一下吗?贴下代码或者给下思路
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int n, m, i, j;
  5.     while (scanf("%d %d", &n, &m) == 2){
  6.         int t, a[3], count = 0;
  7.         a[0] = a[1] = a[2] = m;
  8.         while (a[0] != n || a[1] != n || a[2] != n){//printf("1\n");
  9.             for (i = 0; i < 2; i++){
  10.                 for (j = i; j < 2-i; j++){
  11.                     if (a[j] > a[j+1]){
  12.                         t = a[j];
  13.                         a[j] = a[j+1];
  14.                         a[j+1] = t;
  15.                     }
  16.                 }
  17.             }
  18.             if (a[1] + a[2] > n) a[0] = n;
  19.               else a[0] = a[1] + a[2] - 1;
  20.             count++;
  21.             //printf("%d %d %d\n", a[0], a[1], a[2]);
  22.         }
  23.         printf("%d\n", count);
  24.     }
  25. }
复制代码
//没有注释,说明一下,我的思路的逆着来,变成放大三角形
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-18 22:30:22 | 显示全部楼层
收到,我看看,理解理解。
多谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-18 22:51:53 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<math.h>
  5. void f(int array[])
  6. {
  7.     int temp;
  8.     for (int i = 0; i < 2; i++)
  9.     {
  10.         for (int j = i; j < 2-i; j++)
  11.         {
  12.             if (array[j] > array[j+1])
  13.             {
  14.                 temp = array[j];
  15.                 array[j] = array[j+1];
  16.                 array[j+1] = temp;
  17.             }
  18.         }
  19.     }
  20. }
  21. int main()
  22. {
  23.     int n, m;
  24.     while (scanf("%d %d", &n, &m)>0)
  25.     {
  26.         int i,j,t, a[3], c = 0;
  27.         a[0] = a[1] = a[2] = m;
  28.         while (a[0] < n || a[1] < n || a[2] < n)
  29.         {
  30.             f(a);
  31.             if (a[1] + a[2] <= n) a[0] = a[1] + a[2] - 1;
  32.             else a[0] = n;
  33.             c++;
  34.         }
  35.         printf("%d\n", c);
  36.     }
  37. }
  38. //这样吗
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-19 15:56:46 | 显示全部楼层
horn0603 发表于 2016-12-18 22:30
收到,我看看,理解理解。
多谢了

不用谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 18:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表