PKU2017研究生上機測試

想給老師跪下哭,嗚嗚嗚,我想上學,我想讀書……

A.獎學金(已AC)

#include <cstdio>
#include <algorithm>
using namespace std;

struct Student {
	int id;
	int yuwen, shuxue, yingyu;
	int sum;
}stu[350];

bool cmp(Student a, Student b) {
	if (a.sum != b.sum)
		return a.sum > b.sum;
	else if (a.yuwen != b.yuwen)
		return a.yuwen > b.yuwen;
	else
		return a.id < b.id;
}

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d %d %d", &stu[i].yuwen, &stu[i].shuxue, &stu[i].yingyu);
		stu[i].id = i+1;
		stu[i].sum = stu[i].yuwen + stu[i].shuxue + stu[i].yingyu;
	}
	sort(stu, stu + n, cmp);
	for (int i = 0; i < 5; i++)
		printf("%d %d\n", stu[i].id, stu[i].sum);
	return 0;
}

B.高次同餘方程求解(已AC)

#include <stdio.h>

int main() {
	int k, n;
	scanf("%d %d", &k, &n);
	for (int i = 1; i <= n; i++) {
		int temp = 1;
		for (int j = 0; j < k; j++) {
			temp = temp * i;
			temp %= n;
		}
		if (temp%n == 1)
			printf("%d\n", i);
	}
	return 0;
}

C.二維數組回形遍歷(已AC)

#include <cstdio>
int a[110][110];

int main() {
	int row, col;
	scanf("%d %d", &row, &col);
	for (int i = 1; i <= row; i++)
		for (int j = 1; j <= col; j++)
			scanf("%d", &a[i][j]);
	int num = row * col;
	int beginx = 1, beginy = 1;//beginx,beginy分別表示開始的行和列
	while (num > 0) {
		//先從右至左輸出第一行
		for (int i = beginx, j = beginy; j <= col; j++) {
			printf("%d\n", a[i][j]);
			num--;
			if (num == 0)
				return 0;
		}
		beginx++;
		//從上至下輸出最右列
		for (int i = beginx, j = col; i <= row; i++) {
			printf("%d\n", a[i][j]);
			num--;
			if (num == 0)
				return 0;
		}
		col--;
		//從右至左輸出最下行
		for (int i = row, j = col; j >= beginy; j--) {
			printf("%d\n", a[i][j]);
			num--;
			if (num == 0)
				return 0;
		}
		row--;
		//從下至上輸出最左列
		for (int i = row, j = beginy; i >= beginx; i--) {
			printf("%d\n", a[i][j]);
			num--;
			if (num == 0)
				return 0;
		}
		beginy++;
	}
	return 0;
}

D.BLACK JACK(不知道對不對,沒搜到題)

#include <cstdio>

int main() {
	int an, bn;//我和對方的牌的數量
	int anum = 0, bnum = 0;//我和對方的牌中A的數量
	int asum = 0, bsum = 0;//我和對方的牌的點數和
	bool aflag = false, bflag = false;//我和對方是不是black jack
	scanf("%d", &an);
	getchar();
	for (int i = 0; i < an; i++) {
		char temp;
		scanf("%c", &temp);
		getchar();
		if (temp >= '2' && temp <= '9')
			asum += temp - '0';
		else if (temp == '10' || temp == 'J' || temp == 'Q' || temp == 'K')
			asum += 10;
		else if (temp == 'A') {
			asum += 1;
			anum++;
		}
	}
	while (asum <= 11&&anum!=0) {
		asum += 10;
		anum--;
	}
	if (an == 2 && asum == 21)
		aflag = true;
	scanf("%d", &bn);
	getchar();
	for (int i = 0; i < bn; i++) {
		char temp;
		scanf("%c", &temp);
		getchar();
		if (temp >= '2' && temp <= '9')
			bsum += temp - '0';
		else if (temp == '10' || temp == 'J' || temp == 'Q' || temp == 'K')
			bsum += 10;
		else if (temp == 'A') {
			bsum += 1;
			bnum++;
		}
	}
	while (bsum <= 11 && bnum != 0) {
		bsum += 10;
		bnum--;
	}
	if (bn == 2 && bsum == 21)
		bflag = true;
	if (bsum > 21)
		printf("win");
	else if (asum > 21)
		printf("lose");
	else if (aflag&&!bflag)
		printf("win");
	else if (bflag&&!aflag)
		printf("lose");
	else if (asum > bsum)
		printf("win");
	else if (asum < bsum)
		printf("lose");
	else if (asum == bsum)
		printf("draw");
	return 0;
}

E.我愛學習!
看見題目那幾個WA和TLE我整個人都不好了><

#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
string key[25], sen[25];

int main() {
	int n, m;
	scanf("%d %d", &n, &m);
	getchar();
	for (int i = 0; i < n; i++)
		getline(cin, key[i]);
	for (int i = 0; i < m; i++)
		getline(cin, sen[i]);
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			while (sen[i].find(key[j]) != string::npos) {
				int pos = sen[i].find(key[j]);
				sen[i].erase(pos, key[j].length());
				for (int t = 0; t < key[j].length(); t++)
					sen[i].insert(pos, "*");
			}
		}
		cout << sen[i] << endl;
	}
	return 0;
}

F.水淹七軍
應該是BFS吧?

#include <cstdio>
#include <queue>
#include <string.h>
using namespace std;
const int INF = 0x3fffffff;
int M, N;
int area[210][210];
bool Visit[210][210] = { false };
int X[4] = { 0,0,1,-1 };
int Y[4] = { 1,-1,0,0 };

struct Node {
	int x, y;
}T, S,temp;

bool Judge(int x, int y,int h) {
	if (x <= 0 || x > M || y <= 0 || y > N)
		return false;
	if (Visit[x][y] == true)
		return false;
	if (h <= area[x][y])
		return false;
	return true;
}

bool BFS() {
	queue<Node> q;
	q.push(S);
	while (!q.empty()) {
		Node top = q.front();
		q.pop();
		if (top.x == T.x&&top.y == T.y)
			return true;
		int high = area[top.x][top.y];
		for (int i = 0; i < 4; i++) {
			int Newx = top.x + X[i];
			int Newy = top.y + Y[i];
			if (Judge(Newx, Newy, high)) {
				temp.x = Newx;
				temp.y = Newy;
				q.push(temp);
				area[Newx][Newy] = high;
				Visit[Newx][Newy] = true;
			}
		}
	}
	return false;
}

int main() {
	int t;
	scanf("%d", &t);
	while (t--) {
		bool flag = false;
		scanf("%d %d", &M, &N);
		memset(area, INF, sizeof(area));
		memset(Visit, false, sizeof(Visit));
		for (int i = 1; i <= M; i++)
			for (int j = 1; j <= N; j++)
				scanf("%d", &area[i][j]);
		scanf("%d %d", &T.x, &T.y);
		int water;
		scanf("%d", &water);
		while (water--) {
			scanf("%d %d", &S.x, &S.y);
			if (BFS()) {
				flag = true;
				break;
			}
		}
		if (flag)
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0;
}

G.雞蛋的硬度(已AC)
請參考:NOI庫7627 雞蛋的硬度

#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
int dp[105][105];

int Cal(int n, int m) {
	if (dp[n][m] < 1000)
		return dp[n][m];
	if (n == 0) {
		dp[n][m] = 0;
		return dp[n][m];
	}
	if (n == 1) {
		dp[n][m] = 1;
		return dp[n][m];
	}
	if (m == 0) {
		dp[n][m] = 0;
		return dp[n][m];
	}
	if (m == 1) {
		dp[n][m] = n;
		return dp[n][m];
	}
	for (int i = 1; i <= n; i++)
		dp[n][m] = min(dp[n][m], 1 + max(Cal(i - 1, m - 1), Cal(n - i, m)));
	return dp[n][m];
}

int main() {
	int n, m;
	fill(dp[0], dp[0] + 105 * 105, 1000);
	while (cin >> n >> m) {
		printf("%d\n", Cal(n, m));
	}
	return 0;
}

H.拓撲排序
優先隊列,不會超時。
注意有重邊的情況(這個大坑哇)

#include <cstdio>
#include <queue>
#include <vector>
#include <string.h>
using namespace std;
priority_queue<int, vector<int>, greater<int> >q;
int map[110][110];
int degree[110] = { 0 };

int main() {
	int num, path;
	scanf("%d %d", &num, &path);
	memset(map, -1, sizeof(map));
	for (int i = 0; i < path; i++) {
		int a, b;
		scanf("%d %d", &a, &b);
		if (map[a][b] == -1) 
			degree[b]++;
		map[a][b] = 1;;
	}
	for (int i = 1; i <= num; i++)
		if (degree[i] == 0)
			q.push(i);
	while (!q.empty()) {
		int cur = q.top();
		q.pop();
		printf("v%d ", cur);
		for (int i = 1; i <= num; i++) {
			if (map[cur][i] == 1) {
				map[cur][i] = 0;
				degree[i]--;
				if (degree[i] == 0)
					q.push(i);
			}
		}
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章