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;
}