4道題2小時,又是一道,不過此次的比較難,但第二道不該該的,又是審題不仔細緻使沒過ios
題目1:數組
給定一個字符串,請你將字符串從新編碼,將連續的字符替換成「連續出現的個數+字符」。好比字符串AAAABCCDAA會被編碼成4A1B2C1D2A。佈局
思路:就簡單的字符串處理測試
#include <iostream> #include <string> using namespace std ; int main(){ string str , ans ; cin >> str ; ans = "" ; for(int i=0;i<str.length();i++){ int cnt = 1 ; char temp = str[i] ; while((i+1)<str.length()&&temp==str[i+1]){ cnt++ ; i++ ; } ans = ans + to_string(cnt) + temp ; } cout << ans << endl ; }
第二題:this
在一個N*N的數組中尋找全部橫,豎,左上到右下,右上到左下,四種方向的直線連續D個數字的和裏面最大的值 編碼
輸入描述:
每一個測試輸入包含1個測試用例,第一行包括兩個整數 N 和 D : 3 <= N <= 100 1 <= D <= N 接下來有N行,每行N個數字d: 0 <= d <= 100
輸出描述:
輸出一個整數,表示找到的和的最大值
輸入例子1:
4 2 87 98 79 61 10 27 95 70 20 64 73 29 71 65 15 0
輸出例子1:
193
這道沒過不該該了,自覺得題目中的左上到右下和右上到左下是一個意思,而後就少算了一種狀況,因而只能過80%的樣例,最後有個疑問,既然0<=d<=100,爲何還要考慮負數。。spa
#include <iostream> #include <algorithm> using namespace std ; int findMax(vector<vector<int>> map,int x,int y,int D){ int l , d , ld ,rd; int lc, dc, ldc ,rdc ; int m = 0 ; l = d = ld = rd = 0 ; lc = dc = ldc = rdc = 0 ; for(int i=0;i<D;i++){ if(x+i<map.size()){ d += map[x+i][y] ; dc++ ; } if(y+i<map[0].size()){ l += map[x][y+i] ; lc++ ; } if(x+i<map.size()&&y+i<map[0].size()){ ld += map[x+i][y+i] ; ldc++ ; } if(x+i<map.size()&&y-i>=0){ rd += map[x+i][y-i] ; rdc++ ; } } if(lc!=D) l = 0 ; if(dc!=D) d = 0 ; if(ldc!=D) ld = 0 ; if(rdc!=D) rd = 0 ; m = max(m,l) ; m = max(m,d) ; m = max(m,ld) ; m = max(m,rd) ; return m ; } int main(){ int n , d ; cin >> n ; cin >> d ; vector<vector<int>> map(n,vector<int>(n)) ; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin >> map[i][j] ; } } int ans = 0 ; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ ans = max(ans,findMax(map,i,j,d)) ; } } cout << ans << endl ; }
題目三:推箱子code
你們必定玩過「推箱子」這個經典的遊戲。具體規則就是在一個N*M的地圖上,有1個玩家、1個箱子、1個目的地以及若干障礙,其他是空地。玩家能夠往上下左右4個方向移動,可是不能移動出地圖或者移動到障礙裏去。若是往這個方向移動推到了箱子,箱子也會按這個方向移動一格,固然,箱子也不能被推出地圖或推到障礙裏。當箱子被推到目的地之後,遊戲目標達成。如今告訴你遊戲開始是初始的地圖佈局,請你求出玩家最少須要移動多少步纔可以將遊戲目標達成。 blog
輸入描述:
每一個測試輸入包含1個測試用例 第一行輸入兩個數字N,M表示地圖的大小。其中0<N,M<=8。 接下來有N行,每行包含M個字符表示該行地圖。其中 . 表示空地、X表示玩家、*表示箱子、#表示障礙、@表示目的地。 每一個地圖一定包含1個玩家、1個箱子、1個目的地。
輸出描述:
輸出一個數字表示玩家最少須要移動多少步才能將遊戲目標達成。當不管如何達成不了的時候,輸出-1。
輸入例子1:
4 4 .... ..*@ .... .X.. 6 6 ...#.. ...... #*##.. ..##.# ..X... .@#...
輸出例子1:
3 11
思路:老實說以爲挺難的,並且很久沒有作廣搜的題了,一開始想着人和箱子分兩個階段,人找到箱子以前和找到箱子以後,然而寫的一團亂,反正沒寫出來,後面看了評論區大神的寫法,用一個思惟數組vis[x][y][wx][wy]記錄狀態人在x,y箱子在wx,wy時須要多少步遊戲
以後在中間判斷人的移動有沒有形成箱子的移動就好了。
#include <iostream> #include <queue> #include <string> using namespace std ; struct State{ int x , y , wx , wy ; State(int x,int y,int wx,int wy){ this->x = x ; this->y = y ; this->wx = wx ; this->wy = wy ; } }; int vis[10][10][10][10] ; int map[10][10] ; int ex, ey, x, y, wx, wy , m , n ; int a[]={0,0,1,-1}, b[]={1,-1,0,0} ; queue<State> q ; int bfs(){ vis[x][y][wx][wy] = 1 ; State s(x,y,wx,wy) ; q.push(s) ; while(!q.empty()){ State t = q.front() ; q.pop() ; if(t.wx==ex&&t.wy==ey) return vis[t.x][t.y][t.wx][t.wy]-1 ; for(int i=0;i<4;i++){ int nx = t.x+a[i] ; int ny = t.y+b[i] ; if(nx<0||ny<0||map[nx][ny]=='#'||nx>=n||ny>=m) continue ; if(nx==t.wx&&ny==t.wy){ int nwx = nx+a[i] ; int nwy = ny+b[i] ; if(nwx<0||nwy<0||map[nwx][nwy]=='#'||nwx>=n||nwy>=m) continue ; if(vis[nx][ny][nwx][nwy]) continue ; vis[nx][ny][nwx][nwy] = vis[t.x][t.y][t.wx][t.wy]+1 ; State s(nx,ny,nwx,nwy) ; q.push(s) ; }else{ if(vis[nx][ny][t.wx][t.wy]) continue ; vis[nx][ny][t.wx][t.wy] = vis[t.x][t.y][t.wx][t.wy]+1 ; State s(nx,ny,t.wx,t.wy) ; q.push(s) ; } } } return -1 ; } int main(){ cin >> n >> m ; for(int i=0;i<n;i++){ string row ; cin >> row ; for(int j=0;j<m;j++){ map[i][j] = row[j] ; if(row[j]=='X'){ x = i ; y = j ; } if(row[j]=='*'){ wx = i ; wy = j ; } if(row[j]=='@'){ ex = i ; ey = j ; } } } cout << bfs() << endl ; }
題目4:賽馬
在一條無限長的跑道上,有N匹馬在不一樣的位置上出發開始賽馬。當開始賽馬比賽後,全部的馬開始以本身的速度一直勻速前進。每匹馬的速度都不同,且所有是一樣的均勻隨機分佈。在比賽中當某匹馬追上了前面的某匹馬時,被追上的馬就出局。 請問按以上的規則比賽無限長的時間後,賽道上剩餘的馬匹數量的數學指望是多少
輸入描述:
每一個測試輸入包含1個測試用例 輸入只有一行,一個正整數N 1 <= N <= 1000
輸出描述:
輸出一個浮點數,精確到小數點後四位數字,表示剩餘馬匹數量的數學指望
輸入例子1:
1 2
輸出例子1:
1.0000 1.5000
思路:算是數學題,然而在時間有限的狀況下沒想明白。以後看了評論區答案:速度最大的馬不管在什麼位置均可以不被淘汰,因此速度最大的馬存活的機率是1,而後速度第二大的馬只有在速度最大的馬後面才能存活,只有在它先後兩種狀況,因此存活的機率是1/2,同理,速度第三大的馬有三種排列狀況(不考慮前面兩匹馬的排列),存活機率是1/3,依次類推,因此最後的狀況就是1+1/2+1/3+......1/n。注意不是經過每種排列狀況計算能存活下來的馬的數量,而是根據每匹馬能存活的機率計算。
#include <iostream> #include <iomanip> using namespace std ; int main(){ int n ; double ans = 0; cin >> n ; for(int i=1;i<=n;i++){ ans+=(1.0/i) ; } cout<<setiosflags(ios::fixed)<<setprecision(4)<<ans<<endl ; }