今天的模拟赛打的比较舒服。
但是还要早起跑操+早读+升旗就不太好。
去升旗之前做了第一题,简单的模拟,感觉这很符合cspsT1的难度啊,之前的感觉都有点难了。
- 【贪吃蛇】
题意:
思路:直接用桶记录蛇的位置,考虑怎么记录加和减操作,可以考虑用STL,但是直接维护两个指针也可以。
代码:
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 110;
int n, m, t, q, x, y, op;
int head, tail = 1, ans;
int a[N][N];
bool b[N][N];
bool flag = 0;
char c;
struct Snake { int x, y; } s[N * N];
void work () {
if(c == 'U') --x;
if(c == 'D') ++x;
if(c == 'L') --y;
if(c == 'R') ++y;
}
int main () {
freopen("snake.in", "r", stdin);
freopen("snake.out", "w", stdout);
scanf("%d%d%d%d", &n, &m, &t, &q);
while(t--) {
scanf("%d%d", &x, &y);
b[x][y] = 1;
}
scanf("%d%d", &x, &y);
b[x][y] = 1, s[++head] = {x, y};
while(q--) {
++ans;
scanf("%d", &op);
if(op == 1) {
scanf("%s", &c);
x = s[head].x, y = s[head].y;
work();
if(b[x][y] || x < 1 || x > n || y < 1 || y > m) {
flag = 1; break;
}
s[++head] = {x, y}, b[x][y] = 1;
} else {
x = s[tail].x, y = s[tail].y;
b[x][y] = 0;
++tail;
}
}
if(flag) printf("%d\n", ans);
else puts("-1");
return 0;
}
- 【分糖果】
题意:参考 皇后游戏
思路:考场上没推出来具有传递性的,只推出来 $\min(a_i, b_j) \leq \min(a_j, b_i) $,然后就打上去交了,没想到过了,应该是数据比较水吧。具体思路可以直接看题解,因为markdown太长了我不想打就不写了。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 2e4 + 10;
int T, n;
ll c[N];
struct zx {
int x, y, d;
bool operator < (zx a) const {
if(a.d != d) return d < a.d;
if(d <= 0) return x < a.x;
else return y > a.y;
}
} a[N];
int main() {
cin >> T;
while(T--) {
cin >> n;
for(int i = 1; i <= n; ++i) {
cin >> a[i].x >> a[i].y;
if(a[i].x == a[i].y) a[i].d = 0;
if(a[i].x < a[i].y) a[i].d = -1;
else a[i].d = 1;
}
sort(a + 1, a + n + 1);
ll s = 0;
for(int i = 1; i <= n; ++i) {
s += a[i].x;
c[i] = max(s, c[i - 1]) + a[i].y;
}
cout << c[n] << endl;
}
return 0;
}
- 【排序】
题意: