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,為測試用例的數量。每個...