日常刷题_cf_6.26
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=1nai′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,然后组成一个个数就行了。
妙啊,做cfcfcf的题始终差那临门一脚!
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相关推荐
- 洛谷日常刷题(洛谷官方题单 思路+详解)
目录 前言 非官方题单的题 P1141 01迷宫 1-4 递推与递归 P1255 数楼梯 1002 [ NOIP 2002 普及组]过河卒 P1044 [NOIP2003 普及组] 栈 P1028 [ ...
- [LeetCode][Python][C#]刷题记录 26. 删除排序数组中的重复项
这道题我真的纠结好久,因为没注意那个原地的题目要求,所以很奇怪怎么我电脑运行成功,但是LeetCode上运行就是不对.气哭. 感谢群友lino的帮助.他试了set方法不行,直接喂给我的答案了... 题 ...
- L1-059 敲笨钟 加力扣日常刷题
L1-059 敲笨钟 (20 分) 微博上有个自称"大笨钟V"的家伙,每天敲钟催促码农们爱惜身体早点睡觉.为了增加敲钟的趣味性,还会糟改几句古诗词.其糟改的方法为:去网上搜寻压&q ...
- LeetCode刷题(26)
Insert interval 不想复用上一题的代码,那么就好好搞清楚位置关系吧!对于给定节点node和带插入节点new: 只有当node.end > new.start时才考虑插入问题,那么此 ...
- LeetCode日常刷题1、657、717、67
1. 两数之和 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], ...
- [日常刷题]leetcode D25
文章目录 242. Valid Anagram 258. Add Digits 263. Ugly Number 小结 知识点 242. Valid Anagram Given two strings ...
- C语言——日常刷题(一)
实现如下两个函数(不调用库函数): int myStrLen(char *s); 该函数功能为求字符串s的长度. void myStrConcat(char *string1, char *strin ...
- Leecode 222. 完全二叉树的节点个数——Leecode日常刷题系列
题目链接:https://leetcode-cn.com/problems/count-complete-tree-nodes/ 题解汇总:https://leetcode-cn.com/proble ...
- 【二分法万能模板】Leecode 74. 搜索二维矩阵——Leecode日常刷题系列
题目链接:https://leetcode-cn.com/problems/search-a-2d-matrix/submissions/ 题解汇总:https://leetcode-cn.com/p ...
最新文章
- c语言提取七位数讲解,C语言-体育彩票7位数,感受身中500万的fell
- springboot netty给特定客户端推送_Spring Boot 又升级了?2.0 你搞懂了吗?!
- Qt工作笔记-在QTreeView上实现模型数据的拖拽
- 2018.3.10 模拟赛——(2)给出字符串
- UGUI 屏幕适配 导致 BoxCollider无效 解决记录
- 百度08年网页搜索份额73.2% 创历史新高
- Google 开源机器学习数据集可视化工具 Facets
- 专题九:Simulink系统仿真
- STM32——库函数版——交叉闪烁灯程序
- 翻译: 2深度学习的基础技能 概览
- Docker从理论到实践(八)------Docker网络基础配置
- 认识RAW修图基础知识
- Python列表常用函数总结
- 【校内互侧】ZYF loves binary (dp)
- android 生成bks_生成android的bks证书
- RAKsmart美国云服务器配置升级教程
- 小水管也要有尊严 网络限速优化实际案例
- matlab截取5到10秒音频,如何截取音频中的一段
- 相关系数R-判定系数R方的matlab实现
- Ubuntu20.04中fastdfs,nginx的安装和配置(apt-get安装nginx添加fastdfs-nginx-module模块)