首页 > 其他分享 >2023.8.2 翻转卡片游戏

2023.8.2 翻转卡片游戏

时间:2023-08-03 11:35:02浏览次数:37  
标签:fronts set 卡片 相同 int res 2023.8 翻转

image

坑点注意:x不能与任意一张卡片的正面数字相同,包括自己。因此如果一张卡片正反面数字相同,必然不可能是x。

暴力

由于\(n \leq 1000\),因此\(n^2\)暴力是可以过的。遍历每一个\(nums[i]\),判断其正反面是否相同,相同则跳过,不相同则进一步检验。分为两种情况,一是取\(fronts[i]\),另一种是取\(backs[i]\)。检验其他卡片是否至少有一面不同,如果没有,则不能选为x。如果通过,则与答案取一个min。

集合

建立一个set,事先遍历所有的\(nums[i]\),将所有正反面相同的卡片加入到set中。
正反面相同的卡片,无论如何翻转,都不会改变。而正反面不同的卡片,如果一面数字相同了,我们可以翻转到另一面。

  • 取卡片的正面的情况。遍历所有卡片,判断set中是否存在与\(fronts[i]\)相同的key,如果不存在,说明正面没有数字与它相同,可以选为x,更新答案。
  • 取卡片的反面的情况。遍历所有卡片,判断set中是否存在与\(backs[i]\)相同的key,如果不存在,说明正面同样也没数字与它相同,可以选为x,更新答案。

假设现在有一个卡片1,其正面值为x,反面值为z。而其他卡片中存在一个卡片2其正面值为x,而反面值为y,那么这个卡片是不会被加入到set中的,也就是说x和y必然是不同的。卡片1取正面值时,可以翻转卡片2得到贡献。卡片1取反面值时,可以翻转卡片2也可以不翻转,都也可以得到贡献。

class Solution {
public:
    int flipgame(vector<int>& fronts, vector<int>& backs) 
    {
        int n = fronts.size();
        int res = 0x3f3f3f3f;

        unordered_set<int> s;
        for (int i = 0; i < n; ++i)
        {
            if (fronts[i] == backs[i]) s.insert(fronts[i]);
        }

        for (int x : fronts)
        {
            if (x < res && !s.count(x)) 
                res = x;
        }
        for (int x : backs)
        {
            if (x < res && !s.count(x))
                res = x;
        }
        return res == 0x3f3f3f3f ? 0 : res;
    }
};

标签:fronts,set,卡片,相同,int,res,2023.8,翻转
From: https://www.cnblogs.com/st0rmKR/p/17602833.html

相关文章

  • 2023.8.2
    今天去把之前学的SROP的东西从头梳理了一遍,然后记到了笔记本上,记完之后,我感觉基本上这一块的内容也算是彻底搞明白了。明天开始看花式栈溢出,可能之后还有别的事情要忙,我尽量每天都能花一些时间在网安的学习上。......
  • 暑假集训D9 2023.8.2 补题
    A.「EZEC-10」排列排序给你一个长度为\(n\)的排列\(p_1,p_2,\cdots,p_n\)。你需要把它排序。每次可以花区间长度,即\(r-l+1\)的代价,选择排列中的任意一段区间\([l,r]\),并将\([l,r]\)从小到大排序。现在你可以让他进行若干次这个操作,直到\(p\)中元素的值从\(1\)到......
  • [解题报告] 2023.8.2 dp专题练习赛
    比赛链接:Link[团队私有]T1:https://www.cnblogs.com/SXqwq/p/17600671.htmlT2:https://www.cnblogs.com/SXqwq/p/17601007.htmlT3:完全背包板子T4:https://www.cnblogs.com/SXqwq/p/17601622.html......
  • 翻转二叉树
    思路:使用层序遍历的方法:将根节点入队,然后将根节点的左节点和右节点交换,每次for循环都执行“如果左节点不为空则将左节点入队,如果右节点不为空就将右节点入队,队头出队,将队头的左右结点交换,然后队头的左右节点不为空,将队头的左右结点入队。1voidceng(Node*node,vector<vector......
  • [算法题python]822.翻转卡片游戏
    在桌子上有 n 张卡片,每张卡片的正面和背面都写着一个正数(正面与背面上的数有可能不一样)。我们可以先翻转任意张卡片,然后选择其中一张卡片。如果选中的那张卡片背面的数字 x 与任意一张卡片的正面的数字都不同,那么这个数字是我们想要的数字。哪个数是这些想要的数字中最小的......
  • 2023.8
    1.GoodSubsegments这个已经是典中典题了。首先考虑一个段合法等价于\(mx-mn=r-l\),也就是\(mx-mn-r+l=0\),而且注意到\(mx-mn-r+l\ge0\),所以如果我们全局询问的话,那就是扫描线维护,然后维护一下全局的最小值以及最小值个数就行了。然后区间的子区间计数就考虑套维护历......
  • 2023.8.1
    8月第一天,约好球友一起玩,早上去广场的一号球场玩了一小会儿,好久没有这么爽过了,运动完出一身汗去吃自助餐,中午十二点吃到下午2点,告别彼此坐车回家,路上买了一批冰激凌,老冰棍啥的,晚上学习了一小时半吧,有些累了,看了个电影就休息了。......
  • 2023.8.1
    今天看SROP的时候,突然想到,既然ctfwiki上讲的不是很详细,搜其他SROP的博客,里面讲的例题又和ctfwiki上的不是很一样,仅有一点参考价值。那我为什么不能直接去搜ctfwiki加上SROP这两个关键词呢?这么一搜,果然找到了符合ctfwiki上内容,又有详细解读的博客,找到的第一篇里还是有点不够详细,找......
  • 2023.8.1 英雄的力量
    题目要求返回所有的非空英雄组的力量之和,换言之,只要枚举到的所有组即可,不用管顺序如何。因此我们可以先对序列进行排序,一旦排序完成,那么max和min计算会变得非常简单。前i个数最大的一定是末端那个,最小的一定是起始那个。现在假设a,b,c,d,e五个数(已经排序)。如果现在令d为最大值......
  • 暑假集训D8 2023.8.1 补题
    C.P3029[USACO11NOV]CowLineupS有\(n\)只牛,他们各自有自己的编号(不同牛的编号可能是相同的).这些牛站在不同的位置.现在需要给这些牛拍一张照.有如下要求选定一个范围内的牛拍照,这些牛需要包含所有出现过的编号照片的成本是这个范围,因此范围越小越好已经给定所有......