1. 程式人生 > >【U3D日記-2016年10月9日】一道Codeforces引發的“程式碼整潔”思考

【U3D日記-2016年10月9日】一道Codeforces引發的“程式碼整潔”思考

閒暇時間,做了一道Codeforces試題,上圖


大致意思:Anatoly有一列胡亂排序的r 和 b ,他是完美主義者,他想要通過一些操作,將這些r和b按照 1212121...的方式排列。

這個強迫症先生有兩種方式:

        In one turn he can either swap any two cockroaches, or take any single cockroach and change it's color.

即可以交換佇列中的任意兩個,也可以對任意的單個進行染色(其實,r指red,b指black)

問:任何的操作都算一次,最少幾次達到目標?

我的大概思路是:

這種題我會先用人腦計算幾個例子,我發現人腦總是能很快“巧妙“的找到答案,這並不利於計算機語言。如果每一步操作都試著用兩種方式來解決,看哪個好,也許可以動態規劃來解決,但是好像並不是那樣,因為兩種方式一種是對兩個數操作,一種是對一個數操作。那該怎麼辦....我建議如果有人看到這的話,可以試著思考5分鐘。

有些時候,巨集觀思考會讓問題變得簡單。我發現兩個特點:1、只要第一個確定,後面的必須按1212121的方式,就都會確定。2、兩個數交換的方式比對單個數染色的方式更“好”。

於是,我有了自己的演算法。


於是我的程式碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Codeforces9_AnatolyAndCockroaches {
    class Program {
        static void Main( string[] args ) {
            //In one turn he can either swap any two cockroaches, or take any single cockroach and change it's color.
            int charsLength = int.Parse( Console.ReadLine() );
            string inputValue = Console.ReadLine();
            char[] chars = inputValue.ToCharArray();
            if ( chars.Length != charsLength ) {
                InputWrong();
                return;
            }

            Console.WriteLine( Math.Min( GetTurnCount( 'r', chars ), GetTurnCount( 'b', chars ) ) );
            Console.Read();
        }

        private static int GetTurnCount( char headChar, char[] chars ) {
            int rCount = 0;
            int bCount = 0;
            char temp = headChar;
            for ( int i = 0; i < chars.Length; ++i ) {
                if ( chars[i] != temp ) {
                    if ( temp == 'r' ) rCount++;
                    else bCount++;
                }
                temp = temp == 'r' ? 'b' : 'r';
            }
            return rCount > bCount ? rCount : bCount;
        }

        private static void InputWrong() {
            Console.WriteLine( "input wrong!" );
            Console.Read();
        }
    }
}
在GetTurnCount方法中,temp是一個輔助變數,我覺得這裡可以進行優化,因為判斷奇偶性就可以幹這個事。

於是我將GetTurnCount方法改成:

private static int GetTurnCount( char headChar, char[] chars ) {
            int rCount = 0;
            int bCount = 0;
            for ( int i = 0; i < chars.Length; ++i ) {
                if ( chars[i] != ( i % 2 == 0 ? headChar : ( headChar == 'r' ? 'b' : 'r' ) ) ) {
                    if ( chars[i] == 'r' ) rCount++;
                    else bCount++;
                }
            }
            return rCount > bCount ? rCount : bCount;
        }

但是,當我將這段程式碼給別人看的時候。他們的第一反應是,看不懂!這兩段程式碼是表達一個意思麼?

正當我以為節省了一個變數而沾沾自喜的時候,他們告訴我其實(i%2)也要佔用一個int空間。其實就是沒省,反而程式碼難以閱讀了。

我勒個去....我馬上去查了一下:什麼是“好”的程式碼。

相關推薦

U3D日記-2016109一道Codeforces引發的“程式碼整潔思考

閒暇時間,做了一道Codeforces試題,上圖 大致意思:Anatoly有一列胡亂排序的r 和 b ,他是完美主義者,他想要通過一些操作,將這些r和b按照 1212121...的方式排列。 這個強迫症先生有兩種方式:         In one turn he can

Hub&Switch工作原理,沖突域,以太網幀結構筆記(2017109 11:15:46)

現在 原理 tin 網絡 電信號 進行 數據封裝 tina dma 一、沖突域 網絡中發送的主要是應用程序產生的數據。 數據流需要網絡設備進行數據轉發,任何應用程序在發送數據流之前都要進行數據封裝。 比如:SMAC DMAC | SIP DIP | 報頭(Source Po

WebStorm2018破解(2018109 16:13實測有效)

我的版本是2018.2.2   選擇破解code 複製下面的code 貼上即可。 AWAC5NN6E4-eyJsaWNlbnNlSWQiOiJBV0FDNU5ONkU0IiwibGljZW5zZWVOYW1lIjoibGIgb2QiLCJhc3NpZ25lZU5hbWUi

Java日記 —— 20181022

## 第一天編輯出來忘發了,今天補上 1、從JDK 7開始,語句 ArrayList <AConcreteType> list = new ArrayList<AConcreteType>();      可以簡化為 ArrayList<

Java日記 —— 20181024

一 .HashMap的基本操作 當在hashmap中put的key在之前已經存過,則不會重複儲存,會覆蓋之前key對應的value。 1.containsKey(Object key)方法,返回值為boolean,用於判斷當前hashmap中是否包含key對應的key-va

2016122百度網盤 IDM下載外掛完美圖文教程 完美解決開發者警告問題

總所周知,目前百度網盤外掛已在Chrome商店上下架。目前只能通過載入開發者外掛來進行使用。但是每次啟動Chrome都會提示你去禁用未經許可的外掛。這樣真的很煩。。。很煩。。。為了更好的下載!下載!!下載!!!我終於在外掛開發者的Git上找到了解決方案。我先把最

當年第一個Java作品,Java坦克大戰,寫於201629,放著給初學者~

圖片   備註:當年初學的時候寫的,很多寫得不好,見諒~haha   給初學者看看咯,要是覺得不好也不要噴。 Main.java /** * @author Notzuonotdied * @version1.0 起始時間:2016年

20161030心得

今天是蘇嵌126班開課的第一天。大家滿懷憧憬的去了教室。首先是創始人致辭。隨後是應屆優秀畢業生致辭。應屆優秀的學長中,他們有的以前是學霸,也有的是學渣,但他們通過自己的努力,加上自己的學習方法,都取得了輝煌的成就,有的

爬取糗事百科文欄位子,(20161022可用)

簡單的利用bs4提取了一些東西,中途嘗試了網上的多個版本,自己簡單的模仿了一下。 主要提取部分: <a href="/article/117808662" target="_blank" cla

北京亞控筆試題目(2014109

1 右值左值 C/C++語言中可以放在賦值符號左邊的變數,左值表示儲存在計算機記憶體的物件,左值相當於地址值。右值:當一個符號或者常量放在操作符右邊的時候,計算機就讀取他們的“右值”,也就是其代表的真實值,右值相當於資料值 左值和右值是相對於賦值表示式而言的。左值是能出現在

近幾杭電OJ大型比賽題目合集更新到201710

杭電 網絡賽 2016年 fin 區域賽 現場賽 2015年 font strong 2017年: 區域賽網絡賽 6194~6205 6206~6216 2016年: 區域賽網絡賽 5868~5877 5878~5891 5892~5901 區域賽

201686 九宮格日記

www efi name font atd cross ott uil type html { height: 100% } body { min-height: 100% } a { } img::selection { background-color: rgba(0,

2018103訓練日記

今天的比賽打了一小時。。。做了個A然後GG了。。。 由於昨晚有事情沒睡,結果今天上午定了兩個鬧鐘外加四個電話都沒叫醒。。。醒了之後比賽已經接近尾聲了。。。 這場題目總體來說比較簡單,但是題意表述的不太好,基本都是猜題意。 現在除了3道簽到題,已經補完了5道。難度不是很大,但是題意全靠猜。

2018106訓練日記

今天的比賽打得一般。該出的題目都出了,就是罰時有點多。 主要失誤: 1、a+b還Wa了一發。。。忘了輸入n。。。 2、暴力加剪枝想的太簡單,其實關鍵是把雙向邊轉化為單向邊。(網上說暴力的都欠揍,根本就不算是暴力,怎麼也得算暴力+剪枝) 3、知識點遺漏:斜率優化dp。順便學習一下單調佇

2018107訓練日記

今天的比賽打得不好。主要原因如下: 1、一個隊友因為晚上沒睡好,今天沒來,導致我們隊缺少關鍵讀題人員,簽到題總計Wa了三發 2、讀題。。。像昨天寫的一樣,簽到題比較著急。。。沒有完全確認題意。。。 3、犯了一個之前多校犯過一次的錯誤:陣列下標未統一。上面用的是下標1~4,而下面輸入的是0

20181014訓練日記

這幾天主要打了兩場cf。一場div3 rank300+ 一場div2 rank100+。 感覺做出來的都是些簡單題,做自己拿手的題目反而覺得有些意義不大。。。沒做出來的題目也基本都補了,感覺鍛鍊思維還是極好的。 開了個小號兩場rating1700+,感覺還行。 今天打了個假的區域賽,資料

OJ HDOJ1022 18103121:41 [ 21 ]

這題蛋疼......開始看題目以為只要判斷是否逆序就出來了,後來發現人家網上說【並不是說必須所有的車都進站了  才可以統一按順序出來,而是說可以先進入一輛車然後這輛車出來,然後再進下一輛車,也可以先進兩輛然後出來一輛再進一輛,即何時進站何時出站都可以....】才恍然大悟.... 所

OJ HDOJ1021 18103119:27 [ 20 ]

開局直接WA了 程式碼如圖: # include<iostream> using namespace std; int Feibo[1000000] = {7,11}; bool visit[1000000]; // F(0) = 7, F(1) = 11, F(n) = F

20181024 JS中 “邏輯運算”,“面試題:作用域問題”,“dom對象”這些問題的意見見解

dcb stc ima 事件 代碼 客戶端 document model 變量 1、邏輯運算 || && ! ||:遇到第一個為true的值就中止並返回 &&:遇到第一個為false的值就中止並返回,如果沒有false值,就返回最後一個

201610起微軟更改了更新服務模型

https://blogs.technet.microsoft.com/windowsitpro/2016/08/15/further-simplifying-servicing-model-for-windows-7-and-windows-8-1/ 從 2016 年 10 月版本開始,M