Codeforces Round #753 (Div. 3) 题解
E. Robot on the Board 1
题目大意:给你一个字符串,由"UDLR"组成,"UDLR"表示方向。你有一个n*m的方格,请你找到一个起点,使得这个起点按照给定的字符串进行移动,在走出棋盘(或者执行所有步数)前执行最多的步数。
解题思路:先将起点定在(1,1),当你要走出棋盘的时候,看看能不能通过平移棋盘解决这个问题。同时你也需要记录当前到达的最大x和y,在平移棋盘时最大的x和y不能超过n和m。
#include <iostream>
#include <string>
using namespace std;
int n, m, x, y, nx, ny, maxx, maxy;
string str;
void work() {
cin >> n >> m;
cin >> str;
x = nx = maxx = 1;
y = ny = maxy = 1;
for(int i = 0; i < str.size(); i++) {
if (str[i] == 'U') {
if (nx > 1) nx--;
else {
if (x == n || maxx == n) return ;
x++, maxx++;
}
}
if (str[i] == 'D') {
if (nx < n) nx++;
else return ;
}
if (str[i] == 'L') {
if (ny > 1) ny--;
else {
if (y == m || maxy == m) return ;
y++, maxy++;
}
}
if (str[i] == 'R') {
if (ny < m) ny++;
else return ;
}
maxx = max(nx, maxx);
maxy = max(ny, maxy);
}
}
int main()
{
int T;
cin >> T;
while(T--) {
work();
cout << x << ' ' << y << endl;
}
return 0;
}
F. Robot on the Board 2
题目大意:一个\(n * m\)的矩阵,每个格子有一个字符"UDLR",表示这个格子的方向。请你找一条最长的路径,输出起点的坐标和路径长度。
解题思路:每个点只有一个出度,所以这题的图会变成一个特殊的类型:整幅图有若干个起点和若干个环,任一起点在经过一些点(一条链)后,连入一个环(或者不连)。因此可以使用一个简单的记忆化搜索即可解题。
G. Banquet Preparations 1
题目大意:有\(n\)个盘子,第\(i\)个盘子里有\(a_i\)克鱼肉和\(b_i\)克牛肉。现在有一个大胃王,每个盘子都需要吃\(m\)克的肉。问$ \left|\sum\limits_{i=1}^n a_i - \sum\limits_{i=1}^n b_i\right| $的最小值是多少,并且需要输出每个盘子是如何吃的。
解题思路:第一次循环,先尽可能吃鱼肉;第二次循环,调整每个盘子里吃的比例(少吃一份鱼肉,多吃一份牛肉,会让最终的差值+2)
#include <iostream>
#include <string>
using namespace std;
#define LL long long
#define MaxN 200005
LL a[MaxN], b[MaxN], l[MaxN], r[MaxN], ch[MaxN];
LL n, m;
void work() {
cin >> n >> m;
LL sumA = 0, sumB = 0;
for(int i = 1; i <= n; i++) {
cin >> a[i] >> b[i];
ch[i] = min(a[i], m);
l[i] = a[i] - ch[i];
r[i] = b[i] - (m - ch[i]);
sumA += l[i];
sumB += r[i];
}
LL dif = sumA - sumB;
for(int i = 1; i <= n; i++) {
if (dif < 0) {
LL eStep = (-dif + 1) / 2;
eStep = min(ch[i], eStep);
eStep = min(r[i], eStep);
l[i] += eStep;
r[i] -= eStep;
dif += 2 * eStep;
}
}
cout << abs(dif) << endl;
for(int i = 1; i <= n; i++) {
cout << a[i] - l[i] << ' ' << b[i] - r[i] << endl;
}
}
int main()
{
int T;
cin >> T;
while(T--) {
work();
}
return 0;
}

浙公网安备 33010602011771号