程式設計思維與實踐 CSP M1

2021-10-03 22:44:14 字數 3224 閱讀 9077

/* 我瘋了 為什麼這麼多篇部落格只有這篇說題目重複率較高 部落格管理裡就這篇前面有個驚嘆號逼死強迫症啊啊啊 */

題目:

輸出:最少需要轉的次數

思路:取模

就是乙個取模的問題。

每一次轉的時候,都是兩個字元之間的比較。除第乙個字元是與 『a』 比較以外,其他的字元都是與後乙個字元進行比較。因此用for迴圈實現累加,但要注意的是第乙個字元需要另行與 『a』 比較,而且for迴圈時只比較到倒數第二個字元。

對於每次需要轉的最小次數,設計turn函式計算每次需要轉的最小次數。設這兩個字元為x,y,那麼x,y的相對位置情況有兩種:

而每次計算的轉的次數就是以下兩種情況的最小值:

第一種情況就是|x-y|,第二種情況是26-max(x,y)+min(x,y)。

總結:1.三目運算子還是挺好用的

2.把一些功能函式封裝,有利於理思路

3.注意事項

① 要有意識地新增標頭檔案,abs()函式的標頭檔案為 cmath 。

②要把問題本質從實際問題中抽象出來,而不是就實際問題背景而解決問題。模測的時候想的太多了,在第一題上花的時間顯然過多。一是因為碼力不足(需要反省),二是因為經驗不足。在後面的學習上要一點點積累起來。

**:

#include

#include

#include

using

namespace std;

intturn

(int x,

int y)

intmain()

題目:

思路:等價

要注意到,如果以第二種購買方法購買n次,若n為偶數,可等價為一天以第一種購買方法購買n/2次,第二天同樣以第一種購買方法購買n/2次;若n為奇數,則等價為一天以第一種方法購買(n-1)/2次後,以第二種購買方式購買一次。所以可等價為第二種購買方式最多購買一次。

所以除第一天以外,每天的生煎數可以由兩個指標來判斷,即吃的生煎數的奇偶性和前一天是否有券。

最後,由於不能有多餘的券,所以對最後一天單獨判斷。

總結:1.題意很重要

模測時題意理解錯誤,以為每天最多只能買2個生煎,但其實兩種購買方式每天都可以用無數次【 那時候還奇怪生煎數怎麼會有1000個 (╯‵皿′)╯︵┻━┻

一定一定要看清題目看懂題意再下手!

**:

#include

using

namespace std;

int n;

int num[

200000];

intmain()

else

}//最後一天

if(quan)

else

return0;

}

題目:

輸出:ans,表示有多少個位置會被降智打擊。

思路:dfs/剪枝

如果直接dfs,因為最多30次**,2的30次方絕對tle,所以必須剪枝。

我先嘗試著第一次**的時候,只記錄乙個方向,通過對稱的式子直接將另半邊的點標記了,但還是不行,畢竟除個2也有2的29次方(つд`)。

換思路。首先思考這樣乙個問題。假設!乙個300×300的二維陣列,每個點都是**點,最多30個不同的長度,一共有8個方向,那麼!300×300×30×8,也才10的6次方都不到,和2的30次方完全沒法比!所以!肯定有重複的**點,而且資料越大,重複的超多。所以!先把所有**的點和點的狀態記下來。把重複的全部去掉。

**的點和點的狀態包括座標x,y,和要前進的長度(由於直接在dfs的時候取前進的長度不是很方便,所以只記錄長度在length陣列中的標號)和前進的方向。

在dfs的時候,順表把經過的點用set儲存下來,因為set自動去重。

其他的處理就很容易了。用常量陣列記錄每個方向的偏移量,再用兩個常量陣列記錄每個方向的**點的**方向。

總結:set結構自動去重

通過學習大佬的**終於ac了/(ㄒoㄒ)/~~。dfs的剪枝不是那麼容易的事情啊。

**:

#include

#include

using

namespace std;

int n;

int length[50]

;set< pair<

int,

int>

> s;

bool p[

400]

[400][

50][9

];//左上 0,上 1,右上 2,右 3,右下 4,下 5,左下 6,左 7

const

int dx=

;const

int dy=

;//**後的兩個方向

const

int d1=

;const

int d2=

;void

dfs(

int x,

int y,

int len,

int pre)

//位置,長度的標號,方向 );

}dfs

(x,y,len+

1,d1[pre]);

//d1[pre]為**後的乙個方向

dfs(x,y,len+

1,d2[pre]);

//d2[pre]為**後的另乙個方向

}int

main()

程式設計思維與實踐 CSP M1

咕咕東是個貪玩的孩子,有一天,他從上古遺跡中得到了乙個神奇的圓環。這個圓環由字母表組成首尾相接的環,環上有乙個指標,最初指向字母a。咕咕東每次可以順時針或者逆時針旋轉一格。例如,a順時針旋轉到z,逆時針旋轉到b。咕咕東手裡有乙個字串,但是他太笨了,所以他來請求你的幫助,問最少需要轉多少次。輸入只有一...

程式設計思維與實踐 CSP M1 補題

a 咕咕東的奇遇 題意咕咕東是個貪玩的孩子,有一天,他從上古遺跡中得到了乙個神奇的圓環。這個圓環由字母表組成首尾相接的環,環上有乙個指標,最初指向字母a。咕咕東每次可以順時針或者逆時針旋轉一格。例如,a順時針旋轉到z,逆時針旋轉到b。咕咕東手裡有乙個字串,但是他太笨了,所以他來請求你的幫助,問最少需...

程式設計思維與實踐 CSP M1補題

題目描述 咕咕東是個貪玩的孩子,有一天,他從上古遺跡中得到了乙個神奇的圓環。這個圓環由字母表組成首尾相接的環,環上有乙個指標,最初指向字母a。咕咕東每次可以順時針或者逆時針旋轉一格。例如,a順時針旋轉到z,逆時針旋轉到b。咕咕東手裡有乙個字串,但是他太笨了,所以他來請求你的幫助,問最少需要轉多少次。...