5.28 模拟赛
二次聯通門 : 怎么會有。。。
?
?
?
T1 打表找規律
?
T2 模擬
?
T3 矩陣快速冪
?
T4 mmp
?
T1?
?
?
Problem 1 雙色球(ball.cpp/c/pas)
?
【題目描述】
?
??? 機房來了新一屆的學弟學妹,邪惡的chenzeyu97發現一位學弟與他同名,于是他當起了善良的學長233
?
“來來來,學弟,我考你道水題檢驗一下你的水平……”
?
一個棧內初始有n個紅色和藍色的小球,請你按照以下規則進行操作
?
?
以上3步驟為一次操作
?
如棧中都是紅色球,則操作停止,請問幾次操作后停止
?
chenzeyu97出完題發現他自己不能AC所以想請你幫忙
?
【輸入格式】
?
第一行為一個整數n,表示棧的容量為n
?
第二行為一個字符串,第i個字符表示自頂向下的第i個球的顏色,R代表紅色,B代表藍色
?
【輸出格式】
?
一個整數表示操作數
?
【樣例輸入】
?
樣例1:
?
3
?
RBR
?
樣例2:
?
4
?
RBBR
?
【樣例輸出】
?
樣例1:2
?
樣例2:6
?
【樣例解釋】
?
樣例1:
?
?
?
?
?
樣例2:
?
?
?
?
【數據范圍】
?
50%的數據,1<=n<=20
100%的數據,1<=n<=50
?
/*T1可以發現 把所有藍球的深度i變為2 ^ (i - 1)后累加即為答案 */ #include <cstdio> #include <cmath>#define Max 300void read (int &now) {now = 0;register char word = getchar ();while (word < '0' || word > '9')word = getchar ();while (word >= '0' && word <= '9'){now = now * 10 + word - '0';word = getchar ();} }char line[Max]; int N;int main (int argc, char *argv[]) {freopen ("ball.in","r",stdin);freopen ("ball.out","w",stdout);read (N);long long Answer = 0;scanf("%s", line);for (int i = 0; i < N; i++)if (line[i] == 'B') Answer += pow (2, N - i - 1);printf ("%lld\n", Answer);return 0; }?
?
?
?
?T2
Problem 2 魔方(cube.cpp/c/pas)
【題目描述】
ccy(ndsf)覺得手動復原魔方太慢了,所以他要借助計算機。
ccy(ndsf)家的魔方都是3*3*3的三階魔方,大家應該都見過。
?
(3的“順時針”改為“逆時針”,即3 4以圖為準。)
ccy(ndfs)從網上搜了一篇攻略,并找人翻譯成了他自己會做的方法?,F在告訴你他的魔方情況,以及他從網上搜到的攻略,請你求出最后魔方變成什么樣子。
【輸入格式】
第一行,一串數字,表示從網上搜到的攻略。
下面6*3行,每行3個數字,每三行表示魔方一個面的情況,六個面的順序是前、后、左、右、上、下。
【輸出格式】
6*3行,表示處理后的魔方,形式同輸入。
【樣例輸入】
23
121
221
111
123
321
111
123
321
132
132
231
132
121
112
233
332
111
333
【樣例輸出】
123
222
113
212
321
113
122
321
132
121
333
121
211
312
113
331
111
331
【樣例解釋】
?
?
【數據范圍】
40%的數據,攻略的長度小于5且僅有4種操作的其中一種
100%的數據,攻略的長度小于100
/*T2 自己在紙上畫畫就明白了。。 */ #include <cstring> #include <cstdio>#define Max 30void read (int &now) {now = 0;register char word = getchar ();while (word < '0' || word > '9')word = getchar ();while (word >= '0' && word <= '9'){now = now * 10 + word - '0';word = getchar ();} }class Mofa_Type {private :int map[Max][Max][Max];int now[Max][Max][Max];inline void Update (){for (int i = 1; i <= 6; i++)for (int j = 1; j <= 3; j++)for (int k = 1; k <= 3; k++){if (now[i][j][k])map[i][j][k] = now[i][j][k];}memset (now, 0, sizeof now);}public :void Rotate_1 (){for (int i = 1; i <= 3; i++){now[1][i][3] = map[6][i][3];now[6][i][3] = map[2][i][3];now[2][i][3] = map[5][i][3];now[5][i][3] = map[1][i][3];}for (int i = 1; i <= 3; i++)for (int j = 1; j <= 3; j++)now[4][j][4 - i] = map[4][i][j];Update ();}void Rotate_2 (){for (int i = 1; i <= 3; i++){now[1][i][3] = map[5][i][3];now[5][i][3] = map[2][i][3];now[2][i][3] = map[6][i][3];now[6][i][3] = map[1][i][3];}for (int i = 1; i <= 3; i++)for (int j = 1; j <= 3; j++)now[4][4 - j][i] = map[4][i][j];Update ();}void Rotate_3 (){for (int i = 1; i <= 3; i++){now[1][1][i] = map[3][1][i];now[3][1][i] = map[2][1][i];now[2][1][i] = map[4][1][i];now[4][1][i] = map[1][1][i];}for (int i = 1; i <= 3; i++)for (int j = 1; j <= 3; j++)now[5][j][4 - i] = map[5][i][j];Update ();}void Rotate_4 (){for (int i = 1; i <= 3; i++){now[1][1][i] = map[4][1][i];now[4][1][i] = map[2][1][i];now[2][1][i] = map[3][1][i];now[3][1][i] = map[1][1][i];}for (int i = 1; i <= 3; i++)for (int j = 1; j <= 3; j++)now[5][4 - j][i] = map[5][i][j];Update ();}void Key_In_Date (int i, int j, int k, int now){map[i][j][k] = now;}void Print (){for (int i = 1; i <= 6; i++)for (int j = 1; j <= 3; j++){for (int k = 1; k <= 3; k++)printf ("%d", map[i][j][k]);putchar ('\n');}} };Mofa_Type Flandre;char make[Max];int main (int argc, char *argv[]) {freopen ("cube.in", "r", stdin);freopen ("cube.out", "w", stdout);scanf ("%s", make);char line[5];for (int i = 1; i <= 6; i++)for (int j = 1; j <= 3; j++){scanf ("%s", line);for (int k = 0; k < 3; k++)Flandre.Key_In_Date (i, j, k + 1, line[k] - '0'); }int N = strlen (make);for (int i = 0; i < N; i++){if (make[i] == '1')Flandre.Rotate_1 ();else if (make[i] == '2')Flandre.Rotate_2 ();else if (make[i] == '3')Flandre.Rotate_3 ();else if (make[i] == '4')Flandre.Rotate_4 (); }Flandre.Print (); return 0; }?
?
?
?
T3
Problem 3 czy的后宮(harem.cpp/c/pas)
【題目描述】
czy要妥善安排他的后宮,他想在機房擺一群妹子,一共有n個位置排成一排,每個位置可以擺妹子也可以不擺妹子。有些類型妹子如果擺在相鄰的位置(隔著一個空的位置不算相鄰),就不好看了。假定每種妹子數量無限,求擺妹子的方案數。
【輸入格式】
輸入有m+1行,第一行有兩個用空格隔開的正整數n、m,m表示妹子的種類數。接下來的m行,每行有m個字符1或0,若第i行第j列為1,則表示第i種妹子第j種妹子不能排在相鄰的位置,輸入保證對稱。(提示:同一種妹子可能不能排在相鄰位置)。
【輸出格式】
輸出只有一個整數,為方案數(這個數字可能很大,請輸出方案數除以1000000007的余數。
【樣例輸入】
2 2
01
10
【樣例輸出】
7
【樣例說明】
七種方案為(空,空)、(空,1)、(1、空)、(2、空)、(空、2)、(1,1)、(2,2)。
【數據范圍】
20%的數據,1<n≤5,0<m≤10。
60%的數據,1<n≤200,0<m≤100。
100%的數據,1<n≤1000000000,0<m≤100。
注:此題時限1.5s是因為本評測機跑太慢,大家正常做
但寫的太丑可能T一倆個點
?
?
/*T3原方程為 if (map[j][k])dp[i][j] = (dp[i][j] + dp[i - 1][k]) % Mod其中 dp[i][j] 表示的是第i個位置放j號妹子的方案數 然后就是由上一個位置放第k個妹子的方案數轉移而來然后變成矩陣的形式就行了此題的矩陣還是很好推的但是卻超時三個點。。。 */ #include <cstring> #include <cstdio>#define Max 300void read (long long &now) {now = 0;register char word = getchar ();while (word < '0' || word > '9')word = getchar ();while (word >= '0' && word <= '9'){now = now * 10 + word - '0';word = getchar ();} }long long M, N;#define Mod 1000000007long long Answer = 0; char line[Max];class Martix_Type {private :struct Martix_Date{long long martix[Max][Max];Martix_Date operator * (const Martix_Date &a) const{Martix_Date now;for (long long i = 0; i <= M; i++)for (long long j = 0; j <= M; j++){now.martix[i][j] = 0;for (long long k = 0; k <= M; k++)now.martix[i][j] = (now.martix[i][j] + martix[i][k] * a.martix[k][j]) % Mod;}return now;}};Martix_Date Result, A;public :void Make_Answer (){for (int i = 0; i <= M; i++)for (int j = 0; j <= M; j++){A.martix[i][0] = 1;A.martix[0][i] = 1;Result.martix[0][i] = 1;Result.martix[i][0] = 1;}Fast_Pow (N - 1);for (int i = 0; i <= M; i++)Answer = (Answer + Result.martix[i][0]) % Mod;}void Fast_Pow (long long p){while (p){if (p & 1)Result = A * Result;A = A * A;p >>= 1;}}void Prepare (){for (int i = 1; i <= M; i++){scanf ("%s", line + 1);for (int j = 1; j <= M; j++)if (line[j] == '0'){Result.martix[i][j] = 1;A.martix[i][j] = 1;}}} };Martix_Type Make;int main (int argc, char *argv[]) {freopen ("harem.in", "r", stdin);freopen ("harem.out", "w", stdout);read (N);read (M);Make.Prepare (); Make.Make_Answer (); printf ("%lld", Answer);return 0; }?
?
?
Problem 4 mex(mex.cpp/c/pas)
【題目描述】
?
?
【輸入格式】
?
?
【輸出格式】
?
?
【樣例輸入】
7 5
0 2 1 0 1 3 2
1 3
2 3
1 4
3 6
2 7
【樣例輸出】
3
0
3
2
4
【樣例解釋與數據范圍】
?
?
?
/*T4不會做。。。老早就聽別人說是莫隊。??墒遣粫?就用堆+一堆特判想騙點分。。結果第一個點WA其余點TLE*/ #include <cstdio> #include <vector> #include <queue>#define Max 1000001void read (int &now) {now = 0;register char word = getchar ();while (word < '0' || word > '9')word = getchar ();while (word >= '0' && word <= '9'){now = now * 10 + word - '0';word = getchar ();} }inline int min (int a, int b) {return a < b ? a : b; }inline int max (int a, int b) {return a > b ? a : b; }int N, M;int number[Max];int main (int argc, char *argv[]) {freopen ("mex.in", "r", stdin);freopen ("mex.out", "w", stdout);read (N);read (M);for (int i = 1; i <= N; i++)read (number[i]);int x, y;int Count = 0;while (M--){bool flag = false;read (x);read (y);std :: priority_queue <int, std :: vector<int>, std :: greater<int> > Heap;for (int i = x; i <= y; i++)Heap.push (number[i]);if (Heap.top () >= 1){printf ("%d\n", Heap.top () - 1);continue;} int now;while (!Heap.empty ()){now = Heap.top ();Heap.pop (); if (now + 1 != Heap.top () && now != Heap.top ()){printf ("%d\n", now + 1);flag = true;break;}}if (flag == false)printf ("%d\n", now + 1);}return 0; }?
轉載于:https://www.cnblogs.com/ZlycerQan/p/6915733.html
總結
- 上一篇: redis哨兵集群的搭建
- 下一篇: 人工智能对教育产业的冲击和机遇分析 ——