Codeforces Round #767 (Div. 2)题解
这里写目录标题
- A Download More RAM
- 题解
- 代码
- B GCD Arrays
- 题目
- 题解
- 计算奇偶数的办法
- 代码
- C Meximum Array
- Mex (mathematics)
- 题意
- 题解
- 代码
- D. Peculiar Movie Preferences
- 题意
- 题解
- 代码
A Download More RAM
题解
有n个软件,最初有k个内存,每个软件运行需要ai的内存,运行完可以获得bi个内存,问最后可以获得多少内存?
通过排序先运行所需内存小的软件以获得内存,即排序。
代码
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 111;
struct ab
{int a, b;
} arr[maxn];
bool cmp(ab a, ab b){return a.a < b.a;
}
int main(){int t; cin >> t;while(t--){int n, k; cin >> n >> k;for(int i = 0; i < n; i++) {cin >> arr[i].a;}for(int i = 0; i < n; i++){cin >> arr[i].b;}ll ans = k;sort(arr, arr + n, cmp);int pos = 0;while(arr[pos].a <= ans && pos < n){ans += arr[pos].b;pos++;}cout << ans << '\n';}
}
B GCD Arrays
题目
给你lll到rrr这一段序列,在经过k次操作后,该段序列的最大公因数(即当前序列中的所有数字求解gcd)能否是大于1的数
操作:
从序列中取两个数字,将他们永久的从序列中删除,并加两者的乘积加入到队列中
题解
计算连续数字奇数的个数,即为可操作的最大个数,举例如下
初始状态3,4,5,6,73,4,5,6,73,4,5,6,7
第一次操作3∗5,4,6,73*5,4,6,73∗5,4,6,7
第二次操作3∗5∗7,4,63*5*7,4,63∗5∗7,4,6
可以发现如上两次操作所得序列的gcd都是1
第三次操作3∗5∗7∗4,63*5*7*4,63∗5∗7∗4,6
第四次操作3∗5∗7∗4∗63*5*7*4*63∗5∗7∗4∗6
显然从第三次操作起开始序列存在大于1的公因数了
那么解题思路就是所有奇数结合再加一个偶数序列即可得到大于1的公因数了
计算奇偶数的办法
ll odd = (r - l + 1) / 2;ll even = (r - l + 1) / 2;if ((r - l + 1) % 2 == 1 && r % 2 == 1) odd ++;else even ++;
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){//freopen("in.txt","r",stdin);int t; cin >> t;while(t--){ll l, r, k;cin >> l >> r >> k;if (l == r){if (l == 1)printf("NO\n");elseprintf("YES\n");continue;}ll odd = (r - l + 1) / 2;ll even = (r - l + 1) / 2;if ((r - l + 1) % 2 == 1 && r % 2 == 1) odd ++;else even ++;//3个奇数可以操作三次//printf("%lld\n", odd);if (odd <= k){printf("YES\n");}else{printf("NO\n");}}
}
C Meximum Array
Mex (mathematics)
补集的最小值
题意
给你n个非负数字,你可以进行如下操作,每次选择连续的k个数字,求解这k个数字的Mex,然后放到b序列中,问最长长度为m的字典序的b序列里面的元素是什么?求解数字m和m个元素。
题解
题目要求是要字典序最大的,那么第一个位置一定是整个序列最大MEX,即满足
MEX(p,j)=MEX(p,n)MEX(p,j)=MEX(p, n)MEX(p,j)=MEX(p,n)
找到满足这个条件的第一个数字,然后消除前k个数,然后继续递归。
参考
假如是这一个序列 2 2 3 4 0 1 2 0 可以发现选择1 ~ 8和选择1 ~6所得到的结果是一样的,
那么我们就可以直接选择删除的是1 ~ 6
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
int main(){//freopen("in.txt","r",stdin);int _;for(scanf("%d", &_); _; _--){ll n; cin >> n;std::vector<ll> arr(n + 1); // 输入n个元素std::vector<vector<ll> > idx(n + 1); //记录数字x出现的位置分别为多少for(int i = 0; i < n; i++) { cin >> arr[i];idx[arr[i]].push_back(i); //arr[i]出现的位置为i}std::vector<ll> res; //存储答案ll init = 0;ll mex = 0;ll cur = -1;while(init < n){mex = 0;cur = init;//0<=ai<=nfor(int i = 0; i <= n; i++){auto it = lower_bound(idx[i].begin(), idx[i].end(), init); //查找init位置上是否有iif (it == idx[i].end()){//如果没找到,mex就是imex = i;break;}else {cur = max(*it, cur);}}init = cur + 1; //找下一个位置res.push_back(mex);}cout << res.size() << '\n';for(int i = 0; i < res.size(); i++) cout << res[i] << " ";cout << '\n';}
}
D. Peculiar Movie Preferences
题意
给你n个字符串,每个字符串长度不超过3,问是否能组成回文串
题解
由于字符串长度不超过3,那么可以分类讨论出以下几种情况
- 本身就为回文字符串,例如a,aa,aaa,aba
- 两个子集构成回文串,例如ab和ba,aab和baa
- 两个子集构成回文串,例如ab和cba,或者是abc和ba
注意
2
ab
bad
NO
所以badab是不符合的,即相对顺序不变
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;#define rep(i, a, b) for (int i=a;i<=b;++i)
const int mod = int(1e9) + 7;
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3fLL;
const double pi = acos(-1.0); //M_PI;
const int maxn = 1e5 + 10;//给你n个字符串,每个字符串长度不超过3,问是否能组成回文串int main(){//freopen("in.txt","r",stdin);//freopen("aout.txt","w",stdout);int _;for(scanf("%d", &_); _; _--){int n; cin >> n;bool flag = false;std::vector<string> arr(n);multiset<string> suf, pre;//pre记录前面出现的,suf记录后面出现的,TLE5for(int i = 0; i < n; i++){cin >> arr[i];suf.insert(arr[i]);}for(int i = 0; i < n; i++){suf.erase(suf.find(arr[i]));string now = arr[i];reverse(now.begin(), now.end());//aba ab baif (suf.count(now)){flag = true;break;}if (arr[i].size() == 1){flag = true;break;}if (arr[i].size() == 2){if (arr[i][0] == arr[i][1]){flag = true;break;}}if (arr[i].size() == 3){if (arr[i][0] == arr[i][2]){flag = true;break;}}if (arr[i].size() == 3){//cb abc string t1 = arr[i].substr(1, 2);reverse(t1.begin(), t1.end());if (pre.count(t1)){flag = true;break;}//abc bastring t2 = arr[i].substr(0, 2);reverse(t2.begin(), t2.end());if (suf.count(t2)){flag = true;break;}}pre.insert(arr[i]);}if (flag){printf("YES\n");continue;}else {printf("NO\n");continue;}}
}
Codeforces Round #767 (Div. 2)题解相关推荐
- 【Codeforces Round #767 (Div. 2)】 C. Meximum Array 题解
[Codeforces Round #767 (Div. 2) ]C. Meximum Array 题解 1629C: Meximum Array 题解 [Codeforces Round #767 ...
- Codeforces Round #514 (Div. 2)题解
Codeforces Round #514 (Div. 2)题解 A 喵,直接模拟. B 枚举所有盖章时的,合法的,左上角的位置.能盖的话就盖一下.最后check一下图案是否相等即可 C 一轮一轮的扔 ...
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
- 【算法题解】Codeforces Round #817 (Div. 4)题解
文章目录 Codeforces Round #817 (Div. 4)题解 A. Spell Check B. Colourblindness C. Word Game D. Line E. Coun ...
- Codeforces Round #747 (Div. 2)题解
Codeforces Round #747 (Div. 2)题解 (本博客将持续更新以后每场CF div2的题解,喜欢ACM.OI的小伙伴记得点个关注哟) 昨天夜晚刷网络流刷入迷了,渐渐就忘记了我还要 ...
- Codeforces Round #789 (Div. 2)题解
Codeforces Round #789 (Div. 2)题解 A. Tokitsukaze and All Zero Sequence 原题链接 算法标签 贪心 排序 思路 情况一:数组存在零 → ...
- Codeforces Round #748 (Div. 3) 题解 完整A~G
Codeforces Round #748 (Div. 3) 题解 A. Elections 题意 已知竞选中三个候选人的当前得票数 a , b , c a,b,c a,b,c,现在可以增加任何一个人 ...
- Codeforces Round #533 (Div. 2)题解
link orz olinr AK Codeforces Round #533 (Div. 2) 中文水平和英文水平都太渣..翻译不准确见谅 T1.给定n<=1000个整数,你需要钦定一个值t, ...
- Codeforces Round #734 (Div. 3) 题解
Hello大家好,今天给大家带来的是 Codeforces Round #734 (Div. 3) 的全题目讲解. 本文链接:https://www.lanqiao.cn/questions/2040 ...
最新文章
- win7下的IP-主机名映射
- VMware Tools手动下载
- mht to html
- linux jdk配置环境变量
- C语言再学习 -- 循环语句
- 一份关于jvm内存调优及原理的学习笔记
- 谷歌大脑自门控激活函数Swish
- html超链接点不了_HTML、CSS、JS都有哪些区别?不看必悔
- 首发!《长安十二时辰背后的技术秘籍》正式公开,速来下载
- php email,两种PHP邮件发送的方式
- c/c++教程 - 1.5 运算符
- 2018双十一苏宁20+篇技术干货全整理
- 教你在win10系统开启和使用语音识别
- WPF界面设计—撸大师
- Web开发者和交互设计师必备的5大工具
- 相机PHP,C/C++、C#、PHP相机开发实例 大恒相机SDK
- 实现保留3位有效数字(四舍六入五成双规则)
- 2016年度最受欢迎中国开源软件评选 - 开源中国社区
- SHOW DBS在MongoDB中不显示我的自建库
- 清晨六问?静夜六思?