1、Maximum Subsequence Value

从nnn个数中挑kkk个数,使得∑2i\sum2^i∑2i最大(将这kkk个数用二进制表示,如果二进制第 iii 位为1的数的个数多于max(1,k−2)max(1,k-2)max(1,k−2)个,就加上2i2^i2i)。

题解

性质:选高位为1的数比选多个低位为1的数更优,1+21+22+⋅⋅⋅+2n−1<2n1 + 2^1 + 2^2+···+2^{n-1} <2^n1+21+22+⋅⋅⋅+2n−1<2n

当n>=3n>=3n>=3时,k=3k =3k=3能取得最大的∑2i\sum2^i∑2i。也就是说,当k>3k >3k>3时,多选的k−3k-3k−3个数不能使得原本第iii位的0(k=3k= 3k=3时)变为有效的1,既第iii位全为1,也只有k−3k-3k−3个数,小于 max(1,k−2)max(1,k-2 )max(1,k−2)。

int main()
{int n;cin >> n;long long a[505];myfor(i, 1, n) cin >> a[i];if (n <= 3) {long long ans = a[1];myfor(i, 1, n) ans |= a[i];cout << ans << endl;} else {long long ans = 0;myfor(i, 1, n) myfor(j, i + 1, n) myfor(k, j + 1, n) ans = max(ans, a[i]|a[j]|a[k]);cout << ans << endl;}return 0;
}

2、Solve The Maze

给一张二维迷宫,出口是(n,m)(n,m)(n,m)

  • . 表示这个位置可以行走
  • #表示这个位置是墙
  • G表示这个位置上有一个好人
  • B表示这个位置上有一个坏人

问是否存在一种方案:在某些位置上放墙,既令map[i][j]=′#′map[i][j] = '\#'map[i][j]=′#′,使得好人走出迷宫而坏人不能走出迷宫。

题解

在坏人的周围都放上墙,然后从出口出发,看是否能走到所有好人所在的位置。


3、Tree Shuffling(好题)

一棵树有nnn个节点,每个节点有三个值:aaa(花费),bbb(已有的值),ccc(想要变成的值)

操作:在任意一颗子树中选择kkk个节点,然后按照你的意愿排列这kkk个节点

操作代价:假设这颗子树的根是uuu,operation_cost=2∗k∗a[u]operation\_cost = 2 * k * a[u]operation_cost=2∗k∗a[u]

问任意次操作后,将所有的节点的bbb变成ccc的最小代价是多少?

b,c∈{0,1}b,c\in \{0,1\}b,c∈{0,1}

题解

贪心,从花费较小的节点开始操作起

思路比较简单,就是不会写

pair<ll, ll> DFS(int u, int pa, int cost)  {pair<int, int> now;     // 统计这颗子树需要对几个节点进行重新排列if (b[u] != c[u]) {now.first += b[u];now.second += c[u];}for (int i = head[u]; i != -1; i = e[i].next) {int v = e[i].to;if (v == pa) continue;pair<ll, ll> nex = DFS(v, u, min(cost, a[v]));now.first += nex.first;now.second += nex.second;}int cnt = min(now.first, now.second);ans += 2ll * cnt * cost;    // cost: root -> u 这条链上的最小花费now.first -= cnt;    now.second -= cnt;return now;
}

4、Odd-Even Subsequence

给一个序列aaa,从中挑选kkk个数构成序列sss(不改变数的位置)。定义x=min(max{s1,s3,s5,s7,⋅⋅⋅},max{s2,s4,s6,s8,⋅⋅⋅})x = min(max\{s_1,s_3,s_5,s_7,···\},max\{s_2,s_4,s_6,s_8,···\})x=min(max{s1​,s3​,s5​,s7​,⋅⋅⋅},max{s2​,s4​,s6​,s8​,⋅⋅⋅}),问最小的xxx是多少?

题解

最小化最大值,考虑二分枚举答案,检查以下两种情况即可,换言之,我们需要构造出这样一个子序列sss

  • 答案在奇序列中
  • 答案在偶序列中

我的想法是:假设每次枚举的答案midmidmid一定在aaa中(用midmidmid构造子序列sss),然后发现checkcheckcheck的时候,非常不好做,因为必须判断假设是否成立。

/*
不断缩小答案的上界
*/
bool check(int x) {// 答案在偶序列for (int i = 1, cnt = 0; i <= n; i++) {if (((cnt & 1) && (a[i] <= x)) || (cnt % 2 == 0)) cnt++;    // 构造合适的s(贪心)if (cnt >= k) return true;}// 答案在奇序列for (int i = 1, cnt = 0; i <= n; i++) {if (((cnt % 2 == 0) && (a[i] <= x)) || (cnt & 1)) cnt++;if (cnt >= k) return true;}return false;
}

5、AND, OR and square sum

给一个序列aaa,有如下操作:

  • 任选两个数aia_iai​,aja_jaj​,令ai′=ai&aja_i^{'}= a_i \& a_jai′​=ai​&aj​,aj′=ai∣aja_j^{'} = a_i |a_jaj′​=ai​∣aj​

可以操作任意次,令ans=∑i=1nai′2ans = \sum_{i = 1}^na_i^{'2}ans=∑i=1n​ai′2​,最大化ansansans。

题解

假设x=ai∣ajx = a_i |a_jx=ai​∣aj​,有x>=aix >= a_ix>=ai​且x>=ajx >= a_jx>=aj​,所以我们可以让aaa中的最大值不断变大,而ansansans不会变小。按照这个思路有:令a1=amaxa_1 = a_{max}a1​=amax​(按降序排序),有a1=a1∣a2a_1 = a_1 | a_2a1​=a1​∣a2​,a2=a1&a2a_2 = a_1 \& a_2a2​=a1​&a2​、a1=a1∣a3a_1 = a_1 | a_3a1​=a1​∣a3​,a3=a1&a3a_3 = a_1 \& a_3a3​=a1​&a3​、······、a1=a1∣ana_1 = a_1 | a_na1​=a1​∣an​,an=a1&ana_n = a_1 \& a_nan​=a1​&an​。用相同的办法求出a2′a_2^{'}a2′​,a3′a_3^{'}a3′​,…,an′a_n^{'}an′​,既能求得最大的ansansans。

显然,这样计算需要两次循环,复杂度O(n2)O(n^2)O(n2)。实际上,给出的操作有个性质不会改变每位包含1的个数,既ai′=ai&aja_i^{'} = a_i \& a_jai′​=ai​&aj​,aj′=ai∣aja_j^{'} = a_i | a_jaj′​=ai​∣aj​ 把 aia_iai​ 的二进制位上的 1 给了 aja_jaj​,但总的1的个数并没有改变。

所以,我们只需要统计二进制每位有多少个1,然后组成一个个数就行了。

妙啊,做cf​cf​cf​的题始终差那临门一脚!

int main()
{int x;cin >> n;myfor(i, 1, n) {cin >> x;int t = 0;while(x) {cnt[t++] += x & 1;x >>= 1;}}ll ans = 0;myfor(i, 1, n) {ll x = 0;myfor(j, 0, 20) if (cnt[j]) {x += (1 << j);cnt[j]--;}ans += x * x;}cout << ans << endl;return 0;
}

日常刷题_cf_6.26相关推荐

  1. 洛谷日常刷题(洛谷官方题单 思路+详解)

    目录 前言 非官方题单的题 P1141 01迷宫 1-4 递推与递归 P1255 数楼梯 1002 [ NOIP 2002 普及组]过河卒 P1044 [NOIP2003 普及组] 栈 P1028 [ ...

  2. [LeetCode][Python][C#]刷题记录 26. 删除排序数组中的重复项

    这道题我真的纠结好久,因为没注意那个原地的题目要求,所以很奇怪怎么我电脑运行成功,但是LeetCode上运行就是不对.气哭. 感谢群友lino的帮助.他试了set方法不行,直接喂给我的答案了... 题 ...

  3. L1-059 敲笨钟 加力扣日常刷题

    L1-059 敲笨钟 (20 分) 微博上有个自称"大笨钟V"的家伙,每天敲钟催促码农们爱惜身体早点睡觉.为了增加敲钟的趣味性,还会糟改几句古诗词.其糟改的方法为:去网上搜寻压&q ...

  4. LeetCode刷题(26)

    Insert interval 不想复用上一题的代码,那么就好好搞清楚位置关系吧!对于给定节点node和带插入节点new: 只有当node.end > new.start时才考虑插入问题,那么此 ...

  5. LeetCode日常刷题1、657、717、67

    1. 两数之和 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], ...

  6. [日常刷题]leetcode D25

    文章目录 242. Valid Anagram 258. Add Digits 263. Ugly Number 小结 知识点 242. Valid Anagram Given two strings ...

  7. C语言——日常刷题(一)

    实现如下两个函数(不调用库函数): int myStrLen(char *s); 该函数功能为求字符串s的长度. void myStrConcat(char *string1, char *strin ...

  8. Leecode 222. 完全二叉树的节点个数——Leecode日常刷题系列

    题目链接:https://leetcode-cn.com/problems/count-complete-tree-nodes/ 题解汇总:https://leetcode-cn.com/proble ...

  9. 【二分法万能模板】Leecode 74. 搜索二维矩阵——Leecode日常刷题系列

    题目链接:https://leetcode-cn.com/problems/search-a-2d-matrix/submissions/ 题解汇总:https://leetcode-cn.com/p ...

最新文章

  1. c语言提取七位数讲解,C语言-体育彩票7位数,感受身中500万的fell
  2. springboot netty给特定客户端推送_Spring Boot 又升级了?2.0 你搞懂了吗?!
  3. Qt工作笔记-在QTreeView上实现模型数据的拖拽
  4. 2018.3.10 模拟赛——(2)给出字符串
  5. UGUI 屏幕适配 导致 BoxCollider无效 解决记录
  6. 百度08年网页搜索份额73.2% 创历史新高
  7. Google 开源机器学习数据集可视化工具 Facets
  8. 专题九:Simulink系统仿真
  9. STM32——库函数版——交叉闪烁灯程序
  10. 翻译: 2深度学习的基础技能 概览
  11. Docker从理论到实践(八)------Docker网络基础配置
  12. 认识RAW修图基础知识
  13. Python列表常用函数总结
  14. 【校内互侧】ZYF loves binary (dp)
  15. android 生成bks_生成android的bks证书
  16. RAKsmart美国云服务器配置升级教程
  17. 小水管也要有尊严 网络限速优化实际案例
  18. matlab截取5到10秒音频,如何截取音频中的一段
  19. 相关系数R-判定系数R方的matlab实现
  20. Ubuntu20.04中fastdfs,nginx的安装和配置(apt-get安装nginx添加fastdfs-nginx-module模块)

热门文章

  1. 【转】嵌入式开发正在日薄西山_有道理哦
  2. 2010年搜索引擎的发展状况
  3. 在线代码离线翻译Chrome插件一马v0.0.8 2018-10-31
  4. 计算机三号字在哪个页面,Word用楷体三号一页大约多少字?
  5. 葛冬冬:走出围墙的运筹学拓荒者
  6. 中国移动GPRS概况
  7. 内推网创始人黄小亮:拒绝猎头的P2P招聘
  8. 常见英语面试问答_40个常见的工作面试问答
  9. 杰理之ANC电路设计注意事项【篇】
  10. 小猫咪关闭远程解析功能