首页 > 其他分享 >Birthday Gift

Birthday Gift

时间:2024-03-23 14:44:47浏览次数:22  
标签:包容性 Gift int ++ 枚举 Birthday 分组 我们

我们将\(x++\),从而最终的答案一定是要小于\(x\)的,也就一定要有一位不同

我们从高位到低位枚举最高的一位与\(x\)不同的位置\(i\)(也就是说,认为第\(i+1\)位到最高位都与\(x\)相同,但第\(i\)位不同)

我们先考虑更高位置如何相同

如果更高位置为\(0\),那么那一位必须只能有偶数个\(1\)(否则无论怎么分组,最终这一位都是\(1\)),为了让组数最多,我们考虑每两个相邻\(1\)及其中间的\(0\)分为一组;我们从高到低地对每一位进行代码的分组,根据决策包容性,我们一定不会漏掉分组的组数。举个例子说明

比如在枚举的时候,我们第一次枚举到一个\(0\),然后我们将每两个相邻\(1\)及其中间的\(0\)分为一组,如下

注意我们将每一组的所有数字都删除掉了,并形成一个新组,新组的每一个数字是原来对应组所有数字的异或(可见代码)

接下来我们考虑更低位的时候,我们分组就要满足上面的限制,比如如果我们要把四个\(1\)全部分在一起

就相当于合并新数组的\(a_1,a_2\)以及中间的两个\(0\),根据贪心的决策包容性,显然没有问题

如果更高位置为\(1\),那么随便怎么分组都不会超过限制。只是有一个问题,随便分组可能会导致这一位为\(0\)而不是\(1\),不满足更高位都相同的要求。其实这个时候是不会遗漏最优解的,所以无所谓

主要是学习中间的决策包容性,以及不会遗漏最优解的操作

#include <bits/stdc++.h>
 
using namespace std;
 
using ll = long long;
 
#define int ll
#define all(a) a.begin(), a.end()
 
void solve() {
    int n, x;
    cin >> n >> x;
    ++x;
    vector<int> a(n);
    for (int &i: a)
        cin >> i;
    int res = -1;
    for (int i = 30; i >= 0; --i) {
        vector<int> b;
        bool open = false;//为1表示有奇数个1,为0表示有偶数个1 
        for (int j = 0; j < a.size(); ++j) {
            if (!open)
                b.push_back(a[j]);
            else
                b.back() ^= a[j];
            if (a[j] & (1 << i))
                open = !open;
        }//尝试模拟一下这个循环,就是分组用的 
        if (!(x & (1 << i))) {//如果这一位是0 
            if (open) {//这一位有奇数个1
			//无论怎么分组最后这一位都会为1,大于0
			//我们又认为更高位都相同,所以不用往下循环了 
                cout << res << '\n';
                return;
            }
            a = b;//替换掉合并分组后的数组 
        } else {//如果这一位为1 
            if (!open)//这里就是不会遗漏最优解的原因
			//可以想一下 
                res = max(res, (int) b.size());
        }
    }
    cout << res << '\n';
}
 
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    cin >> t;
    while (t--)
        solve();
}

标签:包容性,Gift,int,++,枚举,Birthday,分组,我们
From: https://www.cnblogs.com/dingxingdi/p/18091114

相关文章

  • 中考英语首字母快速突破007-2021上海金山英语二模-A Candlelit Birthday Dinner Durin
    PDF格式公众号回复关键字:ZKSZM007原文​Onmyfather’sbirthday,myparentsandIwentoutfordinner.Therestaurantwasbrightlylitandverynoisy,withlotsofdiners.Waitersmoveb(71)betweenthetables.​Wehadjustorderedourmeal......
  • E. Anna and the Valentine's Day Gift
    原题链接题解游戏规则总结一句话:安娜要尽可能删掉后导零(翻转),萨沙要尽可能保护后导零(连接),问剩余数字的位数能否达到\(m+1\)位直接模拟即可,统计每个数后导零的长度,然后按照安娜先手的规则求出能保留多少位后导零,最后判断长度code#include<bits/stdc++.h>usingnamespaces......
  • P4090 [USACO17DEC] Greedy Gift Takers P
    原题链接题解1.如果前\(7\)头牛能全部能拿到礼物,但是这前\(7\)头牛里有\(4\)头牛更新在前\(4\)的位置,请问第\(8\)头牛能否得到礼物?答案是不行,因为前\(4\)头牛会在前\(4\)的位置形成循环2.假如恰好第\(x\)头牛没有礼物,那么牛\(x\)之后的牛都得不到礼物,因为不......
  • [USACO17DEC] Greedy Gift Takers
    原题链接首先这道题的数据量1e5那么时间复杂度要保持在O(nlogn)内。先判断单调性,若k头牛拿不到礼物,那么k-1头牛也拿不到礼物,所有这题可以用二分法来做(11110000)。二分部分省略,我们直接来分析check部分(如下)。boolcheck(intk){for(inti=1;i<=n-k+1;i++)b[i]=a[i];s......
  • 初中英语优秀范文100篇-024The Best Gift I've Ever Received -我收到的最好的礼物
    PDF格式公众号回复关键字:SHCZFW024记忆树1AmongallthegiftsIhavereceived,thehand-madescarffromJudyisthebestgiftI'veeverreceived.翻译在我收到的所有礼物中,Judy亲手制作的围巾是我收到的最好的礼物简化记忆围巾句子结构这个句子是一个简单句......
  • As a project I always want to create for myself as a gift, the MVVM framework is
    IusedtowanttobuildaMVVMprojectformyself,especiallysinceIwrotemymementowriterprojectwhichisnojQuery,andthatwasverytimeconsumingandtiringtocreate.Lastyear,Ihadsomeinspiration,andreallywantedtotrytostartfreshthin......
  • CF248E Piglet's Birthday
    提前了一个月,就做掉了这题,不过还是庆祝一下吧。(考虑dp。令\(f_{u,i}\)表示货架\(u\)还剩\(i\)罐未被吃的蜂蜜的概率。答案就是\(\sumf_{u,0}\)。考虑一次修改\(u\tov\),由于被移动的蜜罐都被吃了,所以\(v\)的\(f\)数组不变,只需要考虑\(f_u\)的变化。枚举吃掉了......
  • QOJ # 5573. Holiday Regifting
    题面传送门感觉有点奇妙。首先一个基础的想法就是一个一个往下推,维护每个数往下推的次数,统计当前数在前面的所有数一次归零后会加几次,然后计算这个数需要前面几轮归零,这样将这些系数乘起来就是需要归零的次数了。但是现在有一个问题就是前面每个数往下推的次数可能很大,这东西存......
  • B. Buying gifts[贪心]
    Problem-1801B-Codeforces题意是需要给两个人买礼物,有n个商店,每个商店只能给一个人买,而且每个商店给两个人买的礼物的价钱也可能不同,问给两人买的礼物的最大价格之差最小是多少。我们考虑这种情况。如果当前给b买的礼物最大值为x,那么那些商店里给b礼物价格小于等于x的我们......
  • CF506E Mr. Kitayuta's Gift 思考--zhengjun
    妙妙题。首先可以有一个\(O(kn^2)\)的dp,但是显然不行。但是,发现其中的大多数转移都浪费在自环上了,所以考虑不要这个东西。这个dp一共有三种转移:左右端点一起向内移动一格;左端点或右端点单独移动;左右端点都不动。所以考虑加一维\(k\)表示走了\(k\)次转移1......