用dfs实现但是五十分蒟蒻求助
查看原帖
用dfs实现但是五十分蒟蒻求助
578096
long_hao楼主2022/9/19 20:30
#include <bits/stdc++.h>
using namespace std;
inline long long read()
{
    long long x = 0;
    char ch = getchar();
    while (ch < '0' || ch > '9')
        ch = getchar();
    while (ch >= '0' && ch <= '9')
        x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
    return x;
}
inline void print(long long x)
{
    if (x < 0)
    {
        putchar('-');
        x = -x;
    }
    if (x >= 10)
        print(x / 10);
    putchar(x % 10 + 48);
}
const int maxn = 1e5 + 10;
class edge
{
public:
    long long oper, t;
} v[maxn];
int n, m;
long long check(long long tmp)
{
    for (int j = 1; j <= n; j++)
    {
        if (v[j].oper == 1)
            tmp &= v[j].t;
        else if (v[j].oper == 2)
            tmp |= v[j].t;
        else if (v[j].oper == 3)
            tmp ^= v[j].t;
    }
    return tmp;
}
long long dfs(int cur, long long x)
{
    if (x > m || cur > 32)
        return 0;
    long long ans;
    if (cur == -1 && m >= 1)
    {
        int a = check(1), b = check(0);
        ans = max(a, b);
        if (a < b)
            dfs(cur + 1, 0);
        else
            dfs(cur + 1, 1);
    }
    else
    {
        long long a = check(x * 3), b = check(x);
        ans = max(a, b);
        if (x * 3 > m)
            dfs(cur + 1, x);
        else if (a < b)
            dfs(cur + 1, x);
        else
            dfs(cur + 1, x * 3);
    }
    return ans;
}
long long ans = -0x3f3f3f3f, limit;
int main()
{
    freopen("P2114_2.in", "r", stdin);
    n = read(), m = read();
    for (int i = 1; i <= n; i++)
    {
        string tmp;
        cin >> tmp;
        if (tmp == "AND")
            v[i].oper = 1;
        else if (tmp == "OR")
            v[i].oper = 2;
        else if (tmp == "XOR")
            v[i].oper = 3;
        v[i].t = read();
    }
    print(dfs(-1, 0));
    return 0;
}

dfs 里面的 cur 代表当前尝试的位数, x 是当前的大小,如果下一位填写 1 会比填写 0 大,填写 1 ,反之填写 0 ,但是这个代码 WA 了一半,我直接让所有位数都是 1 都可以拿下 60 分,蒟蒻求助

2022/9/19 20:30
加载中...