10.26训练赛
作者:互联网
emmmmm, 本来事不打算打这场比赛的, 队友都没打, 但是我到实验室的时候刚好开始, 好多人在打, 那我也就打把, 然后, 拉的一批, 先是电脑连不上网, 然后进去后A掉了3道水题, 其中一个线段树调试的时间还是挺长的, 下次要注意, 然后我看到了A题, 我甚至可以说, 我真的想到了题解, 连滚动数组我都想到了, 但是在实现上还是没有成功, 一是没有看时间, 限制竟然是两秒,二是为了枚举可行的点用vector浪费了时间(或许是map),这道题的数据还是卡的比较死的, 所以写了两个小时后我就去写数学了, 在半夜,我看了H题, 也是触摸到了正解的边缘, 但还是没有突破, 所以, 怎么去突破这个瓶颈, 是我现在所需要面对的问题
A. Mio visits ACGN Exhibition
现在看这道题真的很简单, 就是dp一下就行了, 确实没什么可讲的, 不过下次有这种求方案数的题 , 可以把所有的情况都枚举了, 不要用map去强行开数组了, 因为数据过大的情况下空间会不够, 并且clear也会费时间, 即使这种情况不存在;
点击查看代码
#include <bits/stdc++.h>
using namespace std;
//#define int long long
typedef long long ll;
const int mod = 998244353;
const int N = 3e5 + 10;
const int M = 5e2 + 10;
template < typename T > inline void read(T &x) {
x = 0; T ff = 1, ch = getchar();
while (!isdigit(ch)) {
if (ch == '-') ff = -1;
ch = getchar();
}
while (isdigit(ch)) {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
x *= ff;
}
int n, m, p, q, ans = 0, a[M][M];
int f[2][M][M << 1];
int main() {
read(n), read(m), read(p), read(q);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
read(a[i][j]);
f[0][1][0] = 1;
for (int i = 1; i <= n; ++i) {
int u = i & 1, v = u ^ 1;
for (int j = 1; j <= m; ++j) {
int w = a[i][j];
if (!a[i][j]) f[u][j][0] = (f[v][j][0] + f[u][j - 1][0]) % mod;
else f[u][j][0] = 0;
for (int k = 1; k <= i + j - 1; ++k)
f[u][j][k] = (f[v][j][k - w] + f[u][j - 1][k - w]) % mod;
}
}
int u = n & 1;
for (int i = q; i <= n + m - 1 - p; ++i)
ans = (ans + f[u][m][i]) % mod;
printf("%d\n", ans);
return 0;
}
H. Hearthstone So Easy
挺有意思的一道题, 可能因为最近学了博弈论的缘故, 看到这个就想起来了, 但这个好像不符合那个条件, emmmm, 刚开始在我看来, 两个人直接杀就行了, 不用回血,然后我就二分去判断两个人在哪个回合会失败, 但我后来想到, 后面的人摸牌扣血在前面的人之后, 所以我只要一直回血称到前面的人扣血而死不就行了, 然后我就改了个二分的条件,还是错的。 其实这个题不具有二分性, 因为假如A在i+1回合刚好杀了B, 那么B在i回合一定能杀了A,非常绕, 就是在第i回合A操作以后, B进入了A的斩杀线, 但此时A的血量在B造成伤害之后下一回合还不至于掉血而死, 那么B就回血, 这样每个回合之后两人的血量会自然掉, 直到A能掉血掉死B就出手, 真的很绕。。。
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
const int mod = 998244353;
const int N = 5e4 + 10;
const int M = 5e2 + 10;
template < typename T > inline void read(T &x) {
x = 0; T ff = 1, ch = getchar();
while (!isdigit(ch)) {
if (ch == '-') ff = -1;
ch = getchar();
}
while (isdigit(ch)) {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
x *= ff;
}
int t, n, k;
ll sum[N];
signed main() {
read(t);
while (t--) {
read(n), read(k);
int b1 = n, b2 = n;
b1 -= 1;
if (b1 <= 0) {
puts("freesin");
continue;
}
b2 -= 1, b2 -= k;
if (b2 <= 0) puts("pllj");
else puts("freesin");
}
return 0;
}
标签:ch,const,10.26,int,long,回合,训练赛,getchar 来源: https://www.cnblogs.com/AK-ls/p/15468706.html