• 算法习题---3.11换抵挡装置(UVa1588)


    一:题目

    给你连个长度分别为n1,n2且每列高度只为1或2的长条,然后将他们拼在一起,高度不能超过3,问他们拼在一起的最短长度

    二:实现思路

    1.获取主动轮和从动轮的数据。
    2.主动轮不动,从动轮从左向右开始进行卡位,不断更新卡位成功(最大高度不超过3)时的最小长度
    3.注意:当我们在某一时刻的长度若是小于等于主/从动轮的长度时,不向下判断

    三:测试数据

    输入数据

    2112112112
    2212112
    12121212
    21212121
    2211221122
    21212

    输出数据

    10
    8
    15

    四:模拟卡位

    (一)主动轮+从动轮:最小长度两者之和17

    2112112112
    2212112

    (二)开始第一步:高度超过3,失败

    (三)第二步:卡位成功,最小长度变为15

    (四)第三步:卡位成功,最小长度14

    (五)第四步:卡位失败(高度超过3),不进行更新

    (六)第五步:卡位成功,最小长度12

    (七)第六步:卡位失败

    (八)第七步:卡位失败

    (九)第九步:卡位成功,最小长度为10,等于主动轮长度,所以不进行下面的卡位,直接跳出

    五:代码实现

    void test36()
    {
        FILE* fi = freopen("data.in", "r", stdin);
        FILE* fo = freopen("data.out", "w", stdout);
    
        int Mater[100];    //主齿轮
        int Drive[100];    //从齿轮
    
        int ch,Min_Len,Max_Len;
    
        int M_l, D_l;
        int count = 3;
    
        while (!feof(fi))
        {
            memset(Mater, 0, sizeof(Mater));
            memset(Drive, 0, sizeof(Drive));
            M_l = D_l = 0;  //M_l是记录主动轮长度,D_l记录从动轮长度//开始读取主动轮数据
            while ((ch = getchar()) != '
    ' && ch != EOF)
            {
                Mater[M_l++]=ch-'0';
            }
    
            //开始读取从动轮数据
            while ((ch = getchar()) != '
    ' && ch != EOF)    //EOF是-1 字符串结束是''--0
            {
                Drive[D_l++] = ch - '0';
            }
    
            //不能根据长度卡位
            
            //从动轮开始从尾部与主动轮头部卡位,依次得出最小距离
            Min_Len = Max_Len = D_l + M_l;    //初始是两个没有卡位好  D_l+M_l是初值,每当卡位一个就在基础上减一
            //从动轮开始右移
    
    //开始卡位主动轮 从第一个开始到最右边全部出去
            int i, j, flag;
            for (i = 0; i < Max_Len; i++)
            {
                //向左验证
                flag = 1;
                for (j = 0; j <= i; j++)        
                {
                    if (Drive[D_l - 1 - j] + Mater[i - j]>3)    //从动轮的右边开始向左进行验证,若是从动轮高度加上主动轮高度>3-->卡位失败
                    {
                        flag = 0;
                        break;  //卡位失败,不向后进行验证了
                    }
                }
    
                if (flag)    //卡位成功
                {
                    if (j<=M_l)    //从动轮在主动轮左侧
                    {
                        if (j >= D_l)    //全部卡入,是最小  
                        {
                            Min_Len = M_l;
                            break;
                        }
                        else  //没有卡完,只有部分重合,还有一部分在外面未进入
                            if (Min_Len > Max_Len - j)
                                Min_Len = Max_Len - j;
                    }
                    else //从动轮在主动轮右侧
                        if (Min_Len > Max_Len - (D_l - i + M_l - 1))
                            Min_Len = Max_Len - (D_l - i + M_l - 1);
                }
            }
            printf("%d
    ", Min_Len);
        }
    
        freopen("CON", "r", stdin);
        freopen("CON", "w", stdout);
    }
    去掉括号,空格,注释,缩减声明(全部放入一行)...操作以后。代码行数会减少不少(但是没必要)
  • 相关阅读:
    我的架构经验小结(四)-- 实战中演化的三层架构
    DCFramework 动态分布式计算框架(01)-- 基础结构
    XNA基础(01) —— 游戏循环
    使用动态代理记录方法执行的时间
    高性能的大型系统经验 -- 数据查询与分页
    成功的捷径?
    如何激励你的员工?
    DCFramework 动态分布式计算框架(00) -- 序
    在应用程序之间传递动态程序集
    圈 Circle--ESBasic 可复用的.NET类库(03)
  • 原文地址:https://www.cnblogs.com/ssyfj/p/10811589.html
Copyright © 2020-2023  润新知