Google 2015 校招第四輪在線技術筆試 解題報告

題目在這裏:https://code.google.com/codejam/contest/6214486/dashboard


真是各種水啊,滿分無鴨梨。。。一個半小時就全部搞定了。


A. 記憶化搜索,或者叫備忘錄式的動態規劃也行,複雜度O(N * N)

#include <vector>
#include <list>
#include <limits.h>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <string.h>
#include <stdlib.h>
#include <cassert>
#define FOR(i, n) for (int i = 0; i < n; ++i)
using namespace std;

const int MAX_N = 1005;
int dp[MAX_N][MAX_N], arr[MAX_N][MAX_N];
const int dir_x[] = {0, 0, -1, 1};
const int dir_y[] = {1, -1, 0, 0};
int S;
int solve(int x, int y) {
	if (dp[x][y] > 0) return dp[x][y];
	dp[x][y] = 1;
	FOR(k, 4) {
		int xx = x + dir_x[k], yy = y + dir_y[k];
		if (xx < 0 || yy < 0 || xx >= S || yy >= S) continue;
		if (arr[x][y] + 1 != arr[xx][yy]) continue;
		dp[x][y] = max(dp[x][y], solve(xx, yy) + 1);
	}
	return dp[x][y];
}
int main() {
	int T;
	cin >> T;	
	for (int tt = 1; tt <= T; ++tt) {
		cin >> S;
		FOR(i, S) FOR(j, S) { cin >> arr[i][j]; dp[i][j] = 0; }
		int mx = -1, pos = -1;
		FOR(i, S) FOR(j, S) {
			solve(i, j);
			if (dp[i][j] > mx) { mx = dp[i][j]; pos = arr[i][j]; }
			else if (dp[i][j] == mx && arr[i][j] < pos) pos = arr[i][j];
		}
		cout << "Case #" << tt << ": " << pos << " " << mx << endl;
	}
	return 0;
}


B. 大水題,暴力枚舉就可以了

#include <vector>
#include <list>
#include <limits.h>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <string.h>
#include <stdlib.h>
#include <cassert>
#define FOR(i, n) for (int i = 0; i < n; ++i)
using namespace std;

int main() {
	int T, N, res, city, P;
	cin >> T;
	for (int tt = 1; tt <= T; ++tt) {
		cin >> N;
		vector<pair<int, int> > v;
		int x, y;
		FOR(i, N) { cin >> x >> y; v.push_back(make_pair(x, y)); }
		cin >> P;
		cout << "Case #" << tt << ":";
		FOR(i, P) {
			cin >> city;
			res = 0;
			FOR(j, v.size()) res += (city >= v[j].first && city <= v[j].second);
			cout << " " << res;
		}
		cout << endl;
	}
	return 0;
}


C. 每條航班相當於有向圖中的一個點,找到入度爲零的那個點作爲起始點,向下訪問就可以啦

#include <vector>
#include <list>
#include <limits.h>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <string.h>
#include <stdlib.h>
#include <cassert>
#define FOR(i, n) for (int i = 0; i < n; ++i)
using namespace std;

int main() {
	int T, N;
	cin >> T;
	for (int tt = 1; tt <= T; ++tt) {
		cin >> N;
		map<string, string> g;
		map<string, int> cnt;
		FOR(i, N) {
			string from, to;
			cin >> from >> to;
			g[from] = to;
			if (cnt.find(from) == cnt.end()) cnt[from] = 0;			
			if (cnt.find(to) == cnt.end()) cnt[to] = 1;
			else ++cnt[to];
		}
		string s = "";
		for (map<string, int>::iterator it = cnt.begin(); it != cnt.end(); ++it) {
			if ((it->second) == 0) { s = it->first; break; }
		}
		assert(s != "");
		cout << "Case #" << tt << ":";
		while (g.find(s) != g.end()) { cout << " " << s << "-" << g[s]; s = g[s]; }
		cout << endl;
	}
	return 0;
}


D.沒什麼難度,就是模擬起來比較噁心。。

#include <vector>
#include <list>
#include <limits.h>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <string.h>
#include <stdlib.h>
#include <cassert>
#define FOR(i, n) for (int i = 0; i < n; ++i)
using namespace std;

const int dir_x[] = {0, 0, -1, 1, 1, 1, -1, -1};
const int dir_y[] = {-1, 1, 0, 0, -1, 1, -1, 1};

const int nx[] = {2, 2, 1, -1, -2, -2, 1, -1};
const int ny[] = {1, -1, 2, 2, 1, -1, -2, -2};
bool check(int x, int y) {
	if (x < 0 || y < 0 || x >= 8 || y >= 8) return false;
	return true;
}
int main() {
	int T, N;
	char g[8][8];
	string s;
	cin >> T;
	for (int tt = 1; tt <= T; ++tt) {
		cout << "Case #" << tt << ": ";
		cin >> N;
		FOR(i, 8) FOR(j, 8) g[i][j] = '.';
		FOR(i, N) {
			cin >> s;
			int r = s[0] - 'A', c = s[1] - '1';
			g[r][c] = s[3];
		}
		int res = 0;		
		FOR(i, 8) { FOR(j, 8) {
			// cout << "here" << endl;
			if (g[i][j] == '.') continue;
			if (g[i][j] == 'K') {
				FOR(k, 8) {
					int xx = i + dir_x[k], yy = j + dir_y[k];
					if (!check(xx, yy)) continue;
					if (g[xx][yy] != '.') ++res;
				}
			}
			if (g[i][j] == 'Q' || g[i][j] == 'R' || g[i][j] == 'B' || g[i][j] == 'P') {
				int begin = 0, end = 8, cnt = 9999;
				if (g[i][j] == 'R') end = 4;
				else if (g[i][j] == 'B') begin = 4;
				else if (g[i][j] == 'P') { begin = 4; end = 6; cnt = 1; }
				for (int k = begin; k < end; ++k) {
					int x = i, y = j;
					int tmp = cnt;
					while (cnt--) {						
						int xx = x + dir_x[k], yy = y + dir_y[k];
						x = xx; y = yy;
						// cout << "debug: " << xx << " " << yy << endl;
						if (!check(xx, yy)) break;
						if (g[xx][yy] != '.') { ++res; break; }
					}
					cnt = tmp;
				}
			}
			if (g[i][j] == 'N') {
				FOR(k, 8) {
					int xx = i + nx[k], yy = j + ny[k];
					if (!check(xx, yy)) continue;
					if (g[xx][yy] != '.') { ++res; }
				}
			}			
		} }
		cout << res << endl;
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章