鱼C论坛

 找回密码
 立即注册
查看: 1847|回复: 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
#include <stdio.h>
#include <stdlib.h>

long reduce_triangle(long n, long m)
{
        long a = n;
        long b = n;
        long c = n;
        long ret = 0;

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

        c = m;
        ret++;

        while((a != b) || (a != c) || (b != c))
        {
                b = m;
                while((b + c <= a) || (b + a <= c) || (a + c <= b))
                {
                        b++;
                }
                ret++;

                if((a == b) && (a == c) && (b == c))
                {
                        break;
                }

                a = m;
                while((b + c <= a) || (b + a <= c) || (a + c <= b))
                {
                        a++;
                }
                ret++;
        }
        

        return ret;
}

int main()
{
        int n, m;

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

        while(scanf("%d%d", &n, &m) > 0)
        {
                printf("%ld\n", reduce_triangle(n, m));
                
        }

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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
我也写了这个程序,可就是不明白错在哪,可以求教一下吗?贴下代码或者给下思路
#include <stdio.h>
int main()
{
    int n, m, i, j;
    while (scanf("%d %d", &n, &m) == 2){
        int t, a[3], count = 0;
        a[0] = a[1] = a[2] = m;
        while (a[0] != n || a[1] != n || a[2] != n){//printf("1\n");
            for (i = 0; i < 2; i++){
                for (j = i; j < 2-i; j++){
                    if (a[j] > a[j+1]){
                        t = a[j];
                        a[j] = a[j+1];
                        a[j+1] = t;
                    }
                }
            }
            if (a[1] + a[2] > n) a[0] = n;
              else a[0] = a[1] + a[2] - 1;
            count++;
            //printf("%d %d %d\n", a[0], a[1], a[2]);
        }
        printf("%d\n", count);
    }
}
//没有注释,说明一下,我的思路的逆着来,变成放大三角形
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2016-12-18 22:51:53 | 显示全部楼层
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
void f(int array[])
{
    int temp;
    for (int i = 0; i < 2; i++)
    {
        for (int j = i; j < 2-i; j++)
        {
            if (array[j] > array[j+1])
            {
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
    }
}
int main()
{
    int n, m;
    while (scanf("%d %d", &n, &m)>0)
    {
        int i,j,t, a[3], c = 0;
        a[0] = a[1] = a[2] = m;
        while (a[0] < n || a[1] < n || a[2] < n)
        {
            f(a);
            if (a[1] + a[2] <= n) a[0] = a[1] + a[2] - 1;
            else a[0] = n;
            c++;
        }
        printf("%d\n", c);
    }
}
//这样吗
想知道小甲鱼最近在做啥?请访问 -> 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-11-27 17:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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