PKU2018研究生上机测试

PKU2018研究生上机测试网址:2018研究生上机测试

#实力不足,缓慢更新……#

A.喜欢的数

#include <iostream>
#include <string>
using namespace std;

int main() {
	int n;
	string str[25];
	int ans = 0;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> str[i];
	for (int i = 0; i < n; i++) {
		int len = str[i].length();
		int sum = 0;
		bool flag = true;
		for (int k = 0, j = len - 1; k < j; k++, j--) {
			if (str[i][k] != str[i][j]) {
				flag = false;
				break;
			}
			sum = str[i][k] - '0' + str[i][j] - '0';
		}
		if (flag == true) {
			string temp;
			do {
				temp.insert(temp.begin(), sum % 10 + '0');
				sum /= 10;
			} while (sum != 0);
			for (int k = 0, j = temp.length() - 1; k <= j; k++, j--)
				if (temp[k] != temp[j]) {
					flag = false;
					break;
				}
			if (flag)
				ans++;
		}
	}
	printf("%d", ans);
	return 0;
}

B:字符串排序

#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

struct Node {
	string str;
	int num;
	int cur;
}node[110];

bool cmp(Node a, Node b) {
	if (a.num != b.num)
		return a.num < b.num;
	else
		return a.cur < b.cur;
}

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		cin >> node[i].str;
		node[i].cur = i;
		int temp = 0;
		for (int j = 0; j < node[i].str.length(); j++) {
			for (int k = j + 1; k < node[i].str.length(); k++) {
				if (node[i].str[k] < node[i].str[j])
					temp++;
			}
		}
		node[i].num = temp;
	}
	sort(node, node + n, cmp);
	for (int i = 0; i < n; i++)
		cout << node[i].str << endl;
	return 0;
}

C:北大杯台球比赛

#include <cstdio>

bool win(int x, int y) {
	if ((x == 0 && y == 0) || (x == 8 && y == 0) || (x == 16 && y == 0) || (x == 0 && y == 5) || (x == 8 && y == 5) || (x == 16 && y == 5))
		return true;
	return false;
}

int main() {
	int wx, wy, bx, by;
	int dx, dy;
	int power;
	bool flag = true;//flag=true代表现在是白球在走,false代表现在是黑球在走
	scanf("%d %d", &wx, &wy);
	scanf("%d %d", &bx, &by);
	scanf("%d %d", &dx, &dy);
	scanf("%d", &power);
	int ans = 0;
	while (power > 0) {
		if (win(wx, wy))
			ans = -1;
		if (win(bx, by))
			ans = 1;
		if (ans == -1 || ans == 1)
			break;
		if (flag == true) {//白球在走
			wx += dx;//先走再判断
			wy += dy;
			power--;
			if (wx == bx && wy == by)//走完了发现装上黑球,flag=false
				flag = false;
			if (wy == 0||wy==5)//撞上上面或下面的墙壁,
				dy = -dy;
			if (wx == 0||wx==16)//撞上两边的墙壁
				dx = -dx;
		}
		if (flag == false) {
			bx += dx;
			by += dy;
			power--;
			if (by == 0 || by == 5)//撞上上面或下面的墙壁,
				dy = -dy;
			if (bx == 0 || bx == 16)//撞上两边的墙壁
				dx = -dx;
		}
	}
	printf("%d", ans);
	return 0;
}

D:充实的寒假生活

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

struct Action {
	int x, y;//x代表起点,y代表终点
}action[10010];

bool cmp(Action a, Action b) {
	if (a.x != b.x)
		return a.x > b.x;
	else
		return a.y < b.y;
}

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		scanf("%d %d", &action[i].x, &action[i].y);
	sort(action, action + n, cmp);
	int ans = 1;
	int lastX = action[0].x;
	for (int i = 1; i < n; i++) {
		if (action[i].y <= lastX) {
			ans++;
			lastX = action[i].x;
		}
	}
	printf("%d", ans);
	return 0;
}

E:蜜蜂

①用DFS方法做的
(测试了一下1到49,超时,应该选择用dp,递归变递推可能也行?不想试了,练习一下dp)

#include <cstdio>
#include <algorithm>
using namespace std;
int Count = 0;
int Start, End;

void DFS(int x) {
	if (x == End) {
		Count++;
		return;
	}
	if (x > End)
		return;
	DFS(x + 1);
	DFS(x + 2);
}

int main() {
	int n;
	scanf("%d", &n);
	while (n--) {
		//初试化
		Count = 0;
		scanf("%d %d", &Start, &End);
		DFS(Start);
		printf("%d\n", Count);
	}
	return 0;
}

②用动态规划方法做的
HDOJ已AC

#include <cstdio>

long long dp[55][55];

void init() {//dp数组初始化
	for (int i = 1; i < 50; i++) {//边界
		dp[i][i] = 0;
		if (i + 2 < 50)
			dp[i][i + 2] = 2;
		if (i + 1 < 50)
			dp[i][i + 1] = 1;
	}
	for(int i=1;i<50;i++)
		for (int j = i + 3; j < 50; j++) {
				dp[i][j] = dp[i][j - 1] + dp[i][j - 2];
		}
}

int main() {
	init();
	int n;
	scanf("%d", &n);
	while (n--) {
		int i, j;
		scanf("%d %d", &i, &j);
		printf("%lld\n", dp[i][j]);
	}
	return 0;
}

F:Battle City
这题有坑哇!!居然要用优先队列!!因为这不是普通的BFS!
去POJ上搜了一下发现POJ上有,一开始写的普通广搜WA了,搜了一下才知道要用优先队列!
POJ已AC

#include <cstdio>
#include <queue>
#include <string.h>
using namespace std;
int row, col;
bool Visit[310][310] = { false };
char Map[310][310];
int X[4] = { 0,0,1,-1 };
int Y[4] = { 1,-1,0,0 };

struct Node {
	int x, y;
	int steps;
	friend bool operator < (Node a, Node b) {
		return a.steps > b.steps;
	}
}S, T, Temp;

bool Judge(int x, int y) {
	if (x < 0 || x >= row || y < 0 || y >= col)
		return false;
	if (Map[x][y] == 'R' || Map[x][y] == 'S')
		return false;
	if (Visit[x][y] == true)
		return false;
	return true;
}

int BFS() {
	priority_queue<Node> q;
	q.push(S);
	while (!q.empty()) {
		Node top = q.top();
		q.pop();
		if (top.x == T.x&&top.y == T.y)
			return top.steps;
		for (int i = 0; i < 4; i++) {
			int Newx = top.x + X[i];
			int Newy = top.y + Y[i];
			if (Judge(Newx, Newy)) {
				Temp.x = Newx;
				Temp.y = Newy;
				if (Map[Newx][Newy] == 'B')
					Temp.steps = top.steps + 2;
				else
					Temp.steps = top.steps + 1;
				q.push(Temp);
				Visit[Newx][Newy] = true;
			}
		}
	}
	return -1;
}

int main() {
	while (1) {
		scanf("%d %d", &row, &col);
		if (row == 0 && col == 0)
			break;
		memset(Visit, false, sizeof(Visit));
		memset(Map, 'S', sizeof(Map));
		for (int i = 0; i < row; i++) {
			scanf("%s", Map[i]);
			for (int j = 0; j < col; j++) {
				if (Map[i][j] == 'Y') {
					S.x = i;
					S.y = j;
					S.steps = 0;
				}
				if (Map[i][j] == 'T') {
					T.x = i;
					T.y = j;
				}
			}
		}
		printf("%d\n", BFS());
	}
	return 0;
}

G:Find a multiple

#include <cstdio>
#include <cstring>

int a[10010], sum[10010] = { 0 };
int mod[10010] = { 0 };//mod存放的是对应余数的数组的下标

int main() {
	int N;
	scanf("%d", &N);
	memset(mod, -1, sizeof(mod));
	for (int i = 1; i <= N; i++)
		scanf("%d", &a[i]);
	sum[0] = 0;
	for (int i = 1; i <= N; i++) {
		sum[i] = sum[i - 1] + a[i];
		if (sum[i] % N == 0) {
			printf("%d\n", i);
			for (int k = 1; k <= i; k++)
				printf("%d\n", a[k]);
			return 0;
		}
		if (mod[sum[i] % N] != -1) {
			printf("%d\n", i - mod[sum[i] % N]);
			for (int k = mod[sum[i] % N]+1; k <= i; k++)
				printf("%d\n", a[k]);
			return 0;
		}
		else
			mod[sum[i] % N] = i;
	}
	return 0;
}

H.Wormholes
Bellman ford算法

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 510;//最大顶点数
const int MAXM = 2510;//最大边数
const int INF = 0x3fffffff;
int n;//实际顶点数
int d[MAXN];//起点到达各点的最短路径长度
struct Node {
	int v;
	int dis;
	Node(int _v,int _dis):v(_v),dis(_dis){}
};
vector<Node> Adj[MAXN];

bool Bellman(int s) {
	fill(d, d + MAXN, INF);
	d[s] = 0;
	for (int i = 1; i <= n - 1; i++) {
		for (int u = 1; u <= n; u++) {
			for (int j = 0; j < Adj[u].size(); j++) {
				int v = Adj[u][j].v;
				int dis = Adj[u][j].dis;
				if (d[u] + dis < d[v])
					d[v] = d[u] + dis;
			}
		}
	}
	for (int u = 1; u <= n; u++) {
		for (int j = 0; j < Adj[u].size(); j++) {
			int v = Adj[u][j].v;
			int dis = Adj[u][j].dis;
			if (d[u] + dis < d[v])
				return false;
		}
	}
	return true;
}

int main() {
	int t;
	scanf("%d", &t);
	while (t--) {
		int M, T;
		int flag = false;
		scanf("%d %d %d", &n, &M, &T);//n是顶点数,M是多少个路径,T是多少个虫洞
		for (int i = 0; i < M; i++) {
			int a, b, c;
			scanf("%d %d %d", &a, &b, &c);
			Adj[a].push_back(Node(b, c));
			Adj[b].push_back(Node(a, c));
		}
		for (int i = 0; i < T; i++) {
			int a, b, c;
			scanf("%d %d %d", &a, &b, &c);
			Adj[a].push_back(Node(b, -c));
		}
		for (int i = 1; i <= n; i++) {
			if (!Bellman(i)) {
				printf("YES\n");
				flag = true;
				break;
			}
		}
		if(flag==false)
			printf("NO\n");
	}
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值