吐血(1)无厘头烧脑

    /**
     * 烧脑版
     * 就是在一条长L厘米的 绳索上,蚂蚁每秒走一厘米,走到两端都会立刻掉下去,且蚂蚁互相不会交叉过绳索,也就是说碰到时都掉头走,问最后一只蚂蚁掉下绳索的 最长和最短时间
     * @param L 绳索的长度
     * @param data  每一只蚂蚁距离绳索最左边的初始距离
     * @return
     */
    public static int[] t2(int L, int data[]) {
        //蚂蚁数量
        int count = data.length;
        
        //最长时间 ,注意除以2
        int max = 0;
        
        //最短时间
        int min = 0;
        
        //中间值
        int half = L / 2;

        //辅助 数组,用于存储每一个蚂蚁在特定位置的 标志,说明该位置有几只蚂蚁,-1 是特殊情况,是发生相遇事件的处理
        int ruler[] = new int[2 * L + 1];
        int result[] = new int[2];

        for (int i = 0; i < count; i++) {
            min = Math.max(min, Math.min(L - data[i], data[i]));
        }


        //下面的处理是 修改 每一只蚂蚁距离最左边的 初始距离,向左是负方向,向右是正方向前进,且0-L是正,L+1-2L 是负方向前进
        for (int i = 0; i < data.length; i++) {
            if (data[i] > half) {
                data[i] *= -2;
                ruler[(-1) * data[i]] = 1;
            } else {
                data[i] *= 2;
                ruler[data[i]] = 1;
            }
        }
        while (true) {
            max++;
            for (int i = 0; i < data.length; i++) {
                if (data[i] > 0) {
                    switch (ruler[data[i]]) {
                        case 2://蚂蚁相遇,其中一只率先处理冲突
                            ruler[data[i]] = -1;
                            data[i] = -1 * (data[i] - 1);
                            ruler[-1 * data[i]] = 1;
                            break;
                        case -1://蚂蚁相遇,它不是首先处理冲突的.记住,蚂蚁相遇一定是针对两只蚂蚁而言的
                            ruler[data[i]] = 0;
                            ruler[data[i] - 1] = 1;
                            data[i] = -1 * (data[i] - 1);
                            break;
                        case 1://默认情况
                        default:
                            ruler[data[i]] = 0;
                            //加一 , 说明蚂蚁前进了一厘米,但是这里的加一意味着 标志位更新
                            ruler[data[i] + 1] += 1;
                            //这里的加一才是真正的距离更新,因为data存储着距离信息
                            data[i] = data[i] + 1;
                            if (data[i] == 2 * L) {
                                data[i] = 0;
                                count--;
                                if (count == 0) {
                                    break;//直接退出循环,然后在下面判断是否全部的蚂蚁掉下绳索,如果是,则程序终止
                                }
                            }
                    }
                } else if (data[i] < 0) {
                    switch (ruler[-1 * data[i]]) {
                        case 2:
                            ruler[-1 * data[i]] = -1;
                            data[i] = -1 * data[i] + 1;
                            ruler[data[i]] = 1;
                            break;
                        case -1:
                            ruler[-1 * data[i]] = 0;
                            data[i] = -1 * data[i] + 1;
                            ruler[data[i]] = 1;
                            break;
                        case 1:
                        default:
                            ruler[-1 * data[i]] = 0;
                            data[i] = data[i] + 1;
                            ruler[-1 * data[i]] += 1;
                            if (data[i] == 0) {
                                count--;
                                if (count == 0) {
                                    break;
                                }
                            }
                            break;
                    }
                }
            }

            if (count == 0) {
                result[0] = min;
                result[1] = max / 2;
                return result;
            }


        }
    }



吐血版

int Max(int a, int b) {
    return a > b ? a : b;
}

int Min(int a, int b) {
    return a > b ? b : a;
}

void Fun(int L, int count, int *data, int *result) {
    int max = 0;
    int min = 0;
    for (int i = 0; i < count; ++i) {
        min = Max(min, Min(data[i], L - data[i]));
    }

    for (int i = 0; i < count; ++i) {
        max = Max(max, Max(data[i], L - data[i]));
    }
    result[0] = min;
    result[1] = max;
}

void testFun() {
    int testCase = 1000;
    int poleLength = 1000;
    int antsCount = 1000;
    scanf("%d", &testCase);
    int result[testCase][2];
    for (int i = 0; i < testCase; i++) {
        scanf("%d %d", &poleLength, &antsCount);
        int index = 0;
        int antsArray[antsCount];
        while (index < antsCount) {
            scanf("%d", &antsArray[index++]);
        }
        Fun(poleLength, antsCount, antsArray, result[i]);
    }

    for (int j = 0; j < testCase; ++j) {
        printf("%d %d\n", result[j][0], result[j][1]);

    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值