1. 程式人生 > >吐血(1)無厘頭燒腦

吐血(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]);

    }
}


相關推薦

吐血1

/** * 燒腦版 * 就是在一條長L釐米的 繩索上,螞蟻每秒走一釐米,走到兩端都會立刻掉下去,且螞蟻互相不會交叉過繩索,也就是說碰到時都掉頭走,問最後一隻螞蟻掉下繩索的 最長和最短時間 * @param L 繩索的長度 *

人工智慧第三章1——資訊搜尋盲目搜尋 附書本資料

摘要 本章旨在講清楚:1)搜尋問題如何形式化;2)樹搜尋,圖搜尋,及演算法評估;3)一些搜尋策略:寬度優先,一致代價,深度優先,深度受限,迭代加深,雙向搜尋。 前言 這一章說的是Agent,但是是搜尋Agent,所以主要講的是各種搜尋演算法(

【原創】IE11驚現Crash BUG三招搞死你的IE11,並提供可重現代碼

解決問題 html 窗口 前言 stat 錯誤 ont spa 環境 前言 很多人都知道我們在做FineUI控件庫,而且我們也做了超過 9 年的時間,在和瀏覽器無數次的交往中,也發現了多個瀏覽器自身的BUG,並公開出來方便大家查閱: 分享IE7一個神奇的BUG(不是

源射頻混頻器的基本特性1

tar media 留下 時域 過程 inter local logs 運算 混頻器的一個重要作用就是頻率搬運,即將中頻信號搬運到射頻段,或者將射頻信號搬運到中頻段,前者稱為上變頻,後者稱為下變頻。 以上變頻為例,在實際使用中f0稱為IF(Intermediate Fre

十、事勿擾,有事通知1——NSNotification

over ring pass tro 管理中心 代碼 aps pre 發生 概述 很久很久以前,有一只菜鳥正在美滋滋的擼著他的嵌入式C代碼。然而有一天,老板對菜鳥說:“別擼C了,從現在開始你就寫swift開發ios了。”菜鳥一臉懵逼,但還是照做了。 又有一天,菜蛋諂媚的對菜

鎖資料結構1:簡介

希望本文能成為無鎖(lock free)資料結構系列文章一個好的開端。我很樂意與社群分享我的經歷,這個系列就什麼是無鎖資料結構、如何實現以及 STL 容器概念是否適用於無鎖容器,何種情形下適合應用無鎖資料結構做一些分享。 談論無鎖資料結構,必然要談論諸如原子操作、程

快速入門Openstack,多節點部署Mitaka1--前期環境搭建準備

序言 openstack是什麼?官方的解釋:OpenStack is a cloud operating system that controls large pools of compute, storage, and networking reso

Trinity簡介1--用於參考基因組的轉錄組de novo組裝

一、 Trinity簡介 Trinity,是由 the Broad Institute 開發的轉錄組de novo組裝軟體,由三個獨立的軟體模組組成: Inchworm,Chrysalis和Butterfly。三個軟體依次來處理大規模的RNA-seq的reads資料。 Tr

機器學習筆記1監督學習和監督學習

結果 關系 不同 情況 屬於 預測 數據 自己 復雜 監督學習 監督學習是指我們給予算法一個數據集,這個數據集可以是以往相同類型問題的結果,或者絕對正確的經驗答案的集合,也就是統計中常說的樣本,並且這些數據都是有其固有的“正確答案”,然後算法根據這個集合做出對當前相同類型的

ESP8266學習筆記1——搭建環境、編譯

一、搭建環境 1.1 資料準備 《ESP8266 SDK 入門指南》 1.2 安裝安信可ESP8266_IDE(可選) 1.3 安裝VirtualBox 1.4 安裝ESP8266_lubuntu映象檔案 1.在 VirtualBo

基礎演算法題1—— 題目:有1、2、3、4個數字,能組成多少個互不相同且重複數字的四位數?

題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的四位數? 分析題目,要求將1,2,3,4四個數字成各個位數不相同且無重複的四位數,可以寫四個for迴圈,每一個迴圈代表一個位數上的數字,即1——4,再定義一個int型的變數count,初始值為

數據結構—插法逆轉單鏈表——空間復雜度為O1

reat pri 後繼 space using set i++ for 逆轉鏈表 #if 1 #include<stdio.h> #include<stdlib.h> #include<iostream> using na

Python機器學習入門1之導學+監督學習

預處理 全部 install 無監督學習 分類 png ins class 簡單 Python Scikit-learn *一組簡單有效的工具集 *依賴Python的NumPy,SciPy和matplotlib庫 *開源 可復用 sklearn庫的安裝 DOS

廢話設計模式1--簡單工廠、工廠方法、抽象工廠

0-前言   簡單工廠、工廠方法、抽象工廠都是建立型的設計模式,三個設計模式都是工廠的變種,不復雜,下面我們來快速學習這三種; 1-簡單工廠模式   太簡單,UML圖就不畫了,直接上程式碼: //-----------------1、簡單工廠------------ //1-1、生產者父類 class Ph

開始寫博客,學習Linq1

設計 查詢 lin 數據源 任務 集成 部分 程序 編程   摘自《linq實戰》原文:   軟件很簡單。它可以歸結為兩件事情:代碼和數據。   開發軟件卻並非那麽簡單,其中很重要的一項任務就是編寫處理數據的代碼。   無論選擇了哪種語言,在程序開發得某個時候你將不得不開始

GuozhongCrawler系列教程 1 三大PageDownloader

特點 string null 瀏覽器兼容 ror down odi 系列 lan GuozhongCrawler QQ群 202568714 教程源代碼下載地址:http://pan.baidu.com/s/1pJBmerL GuozhongCrawl

正則表達式1

表達式 正則表達式是計算機科學中的一個重要概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器中,正則表達式通常被用來檢索、替換符合某個模式的文本。許多程序設計語言都支持利用正則表達式進行字符串操作。(grep、sed、awk) 為什麽要學習正則表達式?

Angular 4 - The Basics 筆記1: Install

install rst logs nod first log 筆記 npm app Install Node.js Install Angular CLI sudo npm install -g @angular/cli Set-up new app

【Prince2科普】Prince2的七大原則1

步驟 哪些 來看 產品 論證 img .com 驗證 mil 經過前幾講中關於PRINCE2六大要素,四大步驟及整體思維架構的學習,相信各位看官已經對於PRINCE2有了大概的了解,那我們今天的學習內容會正式進入到七大原則內容的分享。 我們先來看一下,PRINCE

SQl 關鍵詞1

order by 結果 tro class 問題 重復 ima 排除 數據 1、Distinct 在表中,可能會包含重復值。這並不成問題,不過,有時您也許希望僅僅列出不同(distinct)的值。 關鍵詞 DISTINCT 用於返回唯一不同的值,過濾掉重復選項。 //