题解|新nim游戏题解

新Nim游戏

https://ac.nowcoder.com/acm/contest/1030/J

做法:线性基+贪心
先手必胜。 游戏的结论是所有数的和不为则先手胜。因为自己可以取一次来修改局面,对手也可以取一次来修改局面,那么现在的目标就变成了取走最少的石头堆,让剩下的石头没有一个非空子集的和为
而线性基刚好满足这一性质。所以问题就变成了构造一个线性基,使其包含的石子数最多。这个将石子降序插入线性基即可。
这是强行两个结论拼起来的题...

#include <bits/stdc++.h>
using namespace std;

#define ll long long
const int N = 100010;

ll ans = 0, a[N];

struct lb {
    int p[64];
    void insert(ll x) {
        ll now = x; 
        for(ll i = 63; i >= 0; --i) {
            if((x >> i) & 1LL) {
                if(p[i]) x ^= p[i];
                else {
                    p[i] = x;
                    ans -= now;
                    return;
                }
            }
        }
    }
} B; 

int main() {
    int n; scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%lld", &a[i]), ans += a[i];
    sort(a + 1, a + n + 1); reverse(a + 1, a + n + 1);
    for(int i = 1; i <= n; ++i) B.insert(a[i]);
    printf("%lld\n", ans);
}
全部评论

相关推荐

牛客928043833号:在他心里你已经是他的员工了
点赞 评论 收藏
分享
asdasdasdasdas:19岁,不容易啊可能升个本会好点,现在学历歧视太严重了
点赞 评论 收藏
分享
24分钟1.自我介绍2.黑盒测试用例设计方法3.运用刚才的测试方法对手机端淘宝购物车结算页面进行测试4.测试流程5.需求文档没有标明边界值,怎么确定边界值,确定边界值后怎么测6.你们公司自动化测试是测业务主流程还是新需求反问:不足之处答:问答问题前思考3s再答,针对提问再答
一笑而过2222:边:边界值分析法(处理输入边界) 类:等价类划分法(划分有效 / 无效输入) 定:判定表法(多条件组合的逻辑判定) 因:因果图法(分析输入输出的因果关系) 迁:状态迁移法(覆盖系统状态转换路径) 场:场景法(模拟端到端业务流程) 正:正交试验法(多因素组合的测试优化) 错:错误推测法(基于经验推测潜在漏洞) 记忆逻辑链(按测试场景优先级排序) 先处理明确输入:边界值 + 等价类(边类) 再处理条件组合:判定表 + 因果图(定因) 接着处理状态与流程:状态迁移 + 场景法(迁场) 最后优化多因素与补漏:正交试验 + 错误推测(正错)
查看6道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务