1.2元旦欢乐赛div1总结
1.2元旦欢乐赛div1总结:
前三道题挺简单的,然后后面的题一道都不会。。
T4 NKOJ7804 拆分数字
一开始不知道怎么做,听了陈欣瑶学姐(手动滑稽)的讲解,发现这是一个背包,物品是n的约数,于是无限背包凑n-1?
代码:
#include <bits/stdc++.h> using namespace std; #define ll long long const ll mod = 1 << 31; ll ans[1000005], f[1000005]; int main() { ll n, tot = 0; scanf("%lld", &n); for (int i = 2; i * i <= n; i++) { if (n % i == 0) { ans[++tot] = i; if (i * i != n) ans[++tot] = n / i; } } sort(ans + 1, ans + tot + 1); f[0] = 1; for (int i = 1; i <= tot; i++) { for (int j = ans[i]; j < n; j++) { f[j] = (f[j] + f[j - ans[i]]) % mod; } } printf("%lld", f[n - 1]); }
T5 NKOJ7807 外卖路程
听说是线段覆盖裸题?身为juruo的我自信心遭到重创
#include <bits/stdc++.h> using namespace std; struct node { int a, b; }p[300005]; inline bool operator< (node x, node y) {return x.b < y.b;} int main() { int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { scanf("%d%d", &p[i].a, &p[i].b); } sort(p + 1, p + n + 1); int l = 0, r = 0; long long ans = m; for (int i = 1; i <= n; i++) { if (p[i].a <= p[i].b) continue; if (p[i].b > r) ans += 2 * (r - l), l = p[i].b; r = max(r, p[i].a); } ans += 2 * (r - l); printf("%lld", ans); }
T6:贴个题面,题比较难不会订正,以后(滑稽)再说[nkoj]7779解题任务
T7:wtcl这个题转化为两个人分别玩即可,但是四维时空复杂度无法承受,所以最后一维要通过计算压掉,然后观察f[i]只与f[i-1]有关,所以考虑滚动
#include <bits/stdc++.h> using namespace std; const int mod = 1024523; inline void add(int &a, int b) {if ((a += b) >= mod) a -= mod;} int f[2][505][505], n, m; char u[505], d[505]; int main() { scanf("%d%d", &n, &m); scanf("%s%s", u + 1, d + 1); f[0][0][0] = 1; for (int l = 0; l < m + n; l++) { int q = l & 1; for (int i = 0; i <= min(l, n); i++) { for (int j = 0; j <= min(l, n); j++) { if (!f[q][i][j]) continue; if (u[i + 1] == u[j + 1]) add(f[q ^ 1][i + 1][j + 1], f[q][i][j]); if (u[i + 1] == d[l - j + 1]) add(f[q ^ 1][i + 1][j], f[q][i][j]); if (u[j + 1] == d[l - i + 1]) add(f[q ^ 1][i][j + 1], f[q][i][j]); if (d[l - j + 1] == d[l - i + 1]) add(f[q ^ 1][i][j], f[q][i][j]); f[q][i][j] = 0; } } } printf("%d", f[n + m & 1][n][n]); }

浙公网安备 33010602011771号