程式設計思維與實踐 Week4 CSP模測

2021-10-04 00:13:37 字數 3698 閱讀 8755

b 咕咕東想吃飯

c 可怕的宇宙射線

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

輸入:輸入只有一行,是乙個字串。

輸出:輸出最少要轉的次數。

樣例:

zeus
18
#include

#include

#include

#include

using

namespace std;

intmain()

cout << res;

return0;

}

咕咕東考試周開始了,考試周一共有n天。他決定每天都吃生煎,咕咕東每天需要買 ai 個生煎。但是生煎店為了刺激消費,只有兩種購買方式:①在某一天一次性買兩個生煎。②今天買乙個生煎,同時為明天買乙個生煎,店家會給乙個券,第二天用券來拿。沒有其餘的購買方式,這兩種購買方式可以用無數次,但是咕咕東是個節儉的好孩子,他訓練結束就走了,不允許訓練結束時手裡有券。咕咕東非常有錢,你不需要擔心咕咕東沒錢,但是咕咕東太笨了,他想問你他能否在考試周每天都能恰好買 ai 個生煎。

輸入:輸入兩行,第一行輸入乙個正整數n(1<=n<=100000)表示考試周的天數。

第二行有n個數,第 i 個數 ai(0<=ai<=10000)表示第 i 天咕咕東要買的生煎的數量。

輸出:如果可以滿足咕咕東奇怪的要求,輸出"yes",如果不能滿足,輸出「no」。(輸出不帶引號)

樣例:

412

12

yes
每次搜尋只進行一次購買,即只產生對今天可購買數-2或今明兩天可購買數各-1的變化,只有當搜尋到最後一天且可購買數剛好為0時成功。

這種方法對於100000天就要搜尋100000的不知道幾次方次,時間複雜度實在可怕,但是我比賽的兩小時裡竟然還在剪枝硬啃…

兩種方法在本質上每天購買的數量都是2,需要偶數個的天數直接採用方案1(對後面無影響),需要奇數個的天數則用一次方案2(對後一天的個數-1)

最後判斷最後一天需要的個數,為偶數則可行(全部採用方案1),為奇數則不可行(採用一次方案2但是剩下券)

若a[i]<0,說明今天用不完明天的券,直接跳出迴圈

若a[i]>=0且為奇數時,採用方案2,明天中有乙個用券購買,a[i+1]-1

#include

#include

#include

#include

using

namespace std;

int n;

int a[

100111];

intmain()

if(a[n-1]

%2) cout <<

"no"

;else cout <<

"yes"

;return0;

}

眾所周知,瑞神已經達到了cs本科生的天花板,但殊不知天外有天,人外有苟。在浩瀚的宇宙中,存在著一種叫做苟狗的生物,這種生物天生就能達到人類研究生的知識水平,並且天生擅長csp,甚至有全國第一的水平!但最可怕的是,它可以發出宇宙射線!宇宙射線可以摧毀人的智商,進行降智打擊!

宇宙射線會在無限的二維平面上傳播(可以看做乙個二維網格圖),初始方向預設向上。宇宙射線會在發射出一段距離後**,向該方向的左右45°方向**出兩條宇宙射線,同時威力不變!宇宙射線會**n 次,每次**後會在**方向前進 ai個單位長度。

現在瑞神要帶著他的小弟們挑戰苟狗,但是瑞神不想讓自己的智商降到普通本科生那麼菜的水平,所以瑞神來請求你幫他計算出共有多少個位置會被"降智打擊"。

輸入:輸入第一行包含乙個正整數n(n<=30) ,表示宇宙射線會**n次。

第二行包含n個正整數a1,a2…an,第 i 個數 ai 表示第 i 次**的宇宙射線會在它原方向上繼續走多少個單位長度。

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

442

23

39
每一級搜尋時,在佇列中加入該級路徑所有的終點,並將路徑上的點加入集合,最後集合容量為路徑長度

這個方法需要遍歷每一條路徑,時間複雜度高,而且bfs需使用佇列,而防止已到達處重複計算需使用集合,相當於每條路徑的終點儲存兩遍,空間複雜度也高,是非常不合適的做法。

每次遞迴將路徑上所有的點加入set(免去判斷是否到達),但是這樣進行指數級遞迴時間太長,需要優化。

由於這道題的擴散是重複的延伸,「每次向該方向的左右45°方向**」,因此可以只對最右的那條路進行dfs,其左邊的那條以當前的主方向為軸進行對稱

八個方向有四種對稱方式,其中兩個只改變x座標或只改變y座標的很簡單,因此考慮兩種斜線的對稱 (還是很複雜的,我特地筆算了)

每次遞迴加入對稱點後還要加入主路上的點。

now用於記錄當前起點(上一層遞迴的終點),i用於記錄遞迴的層數,move用於記錄當前路徑延伸的方向

若未到達底層,則先進入下一層遞迴,傳入起點next(now.x + move_x[move] * a[i], now.y + move_y[move] * a[i]),層數i+1, 方向(move + 1) % 8

對於每個已經在set中的點都要進行對稱再加入set,因此用迭代器遍歷set,對八個不同方向進行四種不同的對稱方法

最後把當前主路徑上的所有點加入set,這些點的座標可以通過1到a[i]長度乘以當前方向在move_x和move_y上的取值得到sym(now.x + move_x[move] * j, now.y + move_y[move] * j)

#include

#include

#include

#include

#include

using

namespace std;

int move_x=

;int move_y=

;int n, a[33]

;struct point

point

(int _x,

int _y)

bool

operator

<

(const point& point)

const};

set points;

void

dfs(point now,

int i,

int move)

else

if(move ==

1|| move ==5)

else

if(move ==

2|| move ==6)

else

if(move ==

3|| move ==7)

}for

(int j =

1; j <= a[i]

; j++)}

intmain()

程式設計思維與實踐 Week4 CSP模擬賽

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

程式設計思維與實踐 Week4 作業

a ddl 的恐懼 zjm 有 n 個作業,每個作業都有自己的 ddl,如果 zjm 沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。所以 zjm 想知道如何安排做作業的順序,才能盡可能少扣一點分。請你幫幫他吧!input 輸入包含t個測試用例。輸入的第一行是單個整數t,為測試用...

程式設計思維與實踐 Week4作業

題目 zjm 有 n 個作業,每個作業都有自己的 ddl,如果 zjm 沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。所以 zjm 想知道如何安排做作業的順序,才能盡可能少扣一點分。請你幫幫他吧!input 輸入包含t個測試用例。輸入的第一行是單個整數t,為測試用例的數量。每個...