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

 

posted @ 2021-01-04 19:51  Chasing-Dreams  阅读(76)  评论(0)    收藏  举报