【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、兩個數交換的方式比對單個數染色的方式更“好”。
於是,我有了自己的演算法。
於是我的程式碼:
在GetTurnCount方法中,temp是一個輔助變數,我覺得這裡可以進行優化,因為判斷奇偶性就可以幹這個事。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方法改成:
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日記-2016年10月9日】一道Codeforces引發的“程式碼整潔”思考
閒暇時間,做了一道Codeforces試題,上圖 大致意思:Anatoly有一列胡亂排序的r 和 b ,他是完美主義者,他想要通過一些操作,將這些r和b按照 1212121...的方式排列。 這個強迫症先生有兩種方式: In one turn he can
Hub&Switch工作原理,沖突域,以太網幀結構筆記(2017年10月9日 11:15:46)
現在 原理 tin 網絡 電信號 進行 數據封裝 tina dma 一、沖突域 網絡中發送的主要是應用程序產生的數據。 數據流需要網絡設備進行數據轉發,任何應用程序在發送數據流之前都要進行數據封裝。 比如:SMAC DMAC | SIP DIP | 報頭(Source Po
WebStorm2018破解(2018年10月9日 16:13實測有效)
我的版本是2018.2.2 選擇破解code 複製下面的code 貼上即可。 AWAC5NN6E4-eyJsaWNlbnNlSWQiOiJBV0FDNU5ONkU0IiwibGljZW5zZWVOYW1lIjoibGIgb2QiLCJhc3NpZ25lZU5hbWUi
Java日記 —— 2018年10月22日
## 第一天編輯出來忘發了,今天補上 1、從JDK 7開始,語句 ArrayList <AConcreteType> list = new ArrayList<AConcreteType>(); 可以簡化為 ArrayList<
Java日記 —— 2018年10月24日
一 .HashMap的基本操作 當在hashmap中put的key在之前已經存過,則不會重複儲存,會覆蓋之前key對應的value。 1.containsKey(Object key)方法,返回值為boolean,用於判斷當前hashmap中是否包含key對應的key-va
【2016年12月2日】百度網盤 IDM下載外掛完美圖文教程 完美解決開發者警告問題
總所周知,目前百度網盤外掛已在Chrome商店上下架。目前只能通過載入開發者外掛來進行使用。但是每次啟動Chrome都會提示你去禁用未經許可的外掛。這樣真的很煩。。。很煩。。。為了更好的下載!下載!!下載!!!我終於在外掛開發者的Git上找到了解決方案。我先把最
當年第一個Java作品,Java坦克大戰,寫於2016年2月9日,放著給初學者~
圖片 備註:當年初學的時候寫的,很多寫得不好,見諒~haha 給初學者看看咯,要是覺得不好也不要噴。 Main.java /** * @author Notzuonotdied * @version1.0 起始時間:2016年
2016年10月30日心得
今天是蘇嵌126班開課的第一天。大家滿懷憧憬的去了教室。首先是創始人致辭。隨後是應屆優秀畢業生致辭。應屆優秀的學長中,他們有的以前是學霸,也有的是學渣,但他們通過自己的努力,加上自己的學習方法,都取得了輝煌的成就,有的
爬取糗事百科文欄位子,(2016年10月22日可用)
簡單的利用bs4提取了一些東西,中途嘗試了網上的多個版本,自己簡單的模仿了一下。 主要提取部分: <a href="/article/117808662" target="_blank" cla
北京亞控筆試題目(2014年10月9日)
1 右值左值 C/C++語言中可以放在賦值符號左邊的變數,左值表示儲存在計算機記憶體的物件,左值相當於地址值。右值:當一個符號或者常量放在操作符右邊的時候,計算機就讀取他們的“右值”,也就是其代表的真實值,右值相當於資料值 左值和右值是相對於賦值表示式而言的。左值是能出現在
近幾年杭電OJ大型比賽題目合集【更新到2017年10月】
杭電 網絡賽 2016年 fin 區域賽 現場賽 2015年 font strong 2017年: 區域賽網絡賽 6194~6205 6206~6216 2016年: 區域賽網絡賽 5868~5877 5878~5891 5892~5901 區域賽
2016年8月6日 九宮格日記
www efi name font atd cross ott uil type html { height: 100% } body { min-height: 100% } a { } img::selection { background-color: rgba(0,
2018年10月3日訓練日記
今天的比賽打了一小時。。。做了個A然後GG了。。。 由於昨晚有事情沒睡,結果今天上午定了兩個鬧鐘外加四個電話都沒叫醒。。。醒了之後比賽已經接近尾聲了。。。 這場題目總體來說比較簡單,但是題意表述的不太好,基本都是猜題意。 現在除了3道簽到題,已經補完了5道。難度不是很大,但是題意全靠猜。
2018年10月6日訓練日記
今天的比賽打得一般。該出的題目都出了,就是罰時有點多。 主要失誤: 1、a+b還Wa了一發。。。忘了輸入n。。。 2、暴力加剪枝想的太簡單,其實關鍵是把雙向邊轉化為單向邊。(網上說暴力的都欠揍,根本就不算是暴力,怎麼也得算暴力+剪枝) 3、知識點遺漏:斜率優化dp。順便學習一下單調佇
2018年10月7日訓練日記
今天的比賽打得不好。主要原因如下: 1、一個隊友因為晚上沒睡好,今天沒來,導致我們隊缺少關鍵讀題人員,簽到題總計Wa了三發 2、讀題。。。像昨天寫的一樣,簽到題比較著急。。。沒有完全確認題意。。。 3、犯了一個之前多校犯過一次的錯誤:陣列下標未統一。上面用的是下標1~4,而下面輸入的是0
2018年10月14日訓練日記
這幾天主要打了兩場cf。一場div3 rank300+ 一場div2 rank100+。 感覺做出來的都是些簡單題,做自己拿手的題目反而覺得有些意義不大。。。沒做出來的題目也基本都補了,感覺鍛鍊思維還是極好的。 開了個小號兩場rating1700+,感覺還行。 今天打了個假的區域賽,資料
【 OJ 】 HDOJ1022 18年10月31日21:41 [ 21 ]
這題蛋疼......開始看題目以為只要判斷是否逆序就出來了,後來發現人家網上說【並不是說必須所有的車都進站了 才可以統一按順序出來,而是說可以先進入一輛車然後這輛車出來,然後再進下一輛車,也可以先進兩輛然後出來一輛再進一輛,即何時進站何時出站都可以....】才恍然大悟.... 所
【 OJ 】 HDOJ1021 18年10月31日19: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
2018年10月24日 JS中 【“邏輯運算”,“面試題:作用域問題”,“dom對象”】這些問題的意見見解
dcb stc ima 事件 代碼 客戶端 document model 變量 1、邏輯運算 || && ! ||:遇到第一個為true的值就中止並返回 &&:遇到第一個為false的值就中止並返回,如果沒有false值,就返回最後一個
2016年10月起微軟更改了更新服務模型
https://blogs.technet.microsoft.com/windowsitpro/2016/08/15/further-simplifying-servicing-model-for-windows-7-and-windows-8-1/ 從 2016 年 10 月版本開始,M