Codeforces Round #653 (Div. 3)(A, B, C, D, E1详解)

Codeforces Round #653 (Div. 3)

Required Remainder

Thinking(binary search)

既然是找最大值问题,我又懒得去推式子,于是我直接就上了一个二分,二分写法比结论稍微繁琐了一点吧,但是还是挺好想的。

根据题意,我们的任务就是找到一个最大的数,满足ans=k∗x+y<=nans = k * x + y <= nans=kx+y<=n,于是我们就可以通过二分枚举kkk,来得到我们的答案。通过题目给定的x,y,zx, y, zx,y,z的范围,我们可以确定二分的区间最多不过0190 ~ 1^90 19

Coding

#include <bits/stdc++.h>
#define mp make_pair
#define pb push_backusing namespace std;typedef long long ll;
typedef pair<int, int> pii;
typedef unsigned long long ull;const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-7;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')  f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (48 ^ c);c = getchar();}return f * x;
}const int N = 1e6 + 10;char str[N];int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int _ = read();while(_--) {ll x = read(), y = read(), n = read();ll l = 0, r = 1e9 + 10;while(l < r) {ll mid = l + r + 1 >> 1;if(mid * x + y <= n)  l = mid;else r = mid - 1;}printf("%lld\n", l * x + y);}return 0;
}

Multiply by 2, divide by 6

Thinking

判断能否通过0个或者多个乘二的操作,使数字变成6的倍数。我们想想6的两个质因子2,32, 32,3,要想达到这个目的,对于初始的nnn,只可能有这两种质因子,否则我们一定达不到我们的目标。于是我们可以先对nnn,进行2,32, 32,3的质因数提取,假设得到的222的因子个数是num2num2num2333的因子个数是num3num3num3,因为我们是同时消去2,32, 32,3因子的,并且只能增加或者不增加222的因子个数,所以只有当num2<=num3num2 <= num3num2<=num3时,才能保证我们可以消去所有的2,32, 32,3因子,最后变成111

Coding

#include <bits/stdc++.h>
#define mp make_pair
#define pb push_backusing namespace std;typedef long long ll;
typedef pair<int, int> pii;
typedef unsigned long long ull;const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-7;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')  f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (48 ^ c);c = getchar();}return f * x;
}const int N = 1e6 + 10;char str[N];int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int _ = read();while(_--) {ll n = read();int num2 = 0, num3 = 0;while(n % 3 == 0) {n /= 3;num3++;}while(n % 2 == 0) {n /= 2;num2++;}//最后n不是1说明还存在其他的质因子。if(n != 1 || num2 > num3) puts("-1");else  printf("%d\n", num3 + num3 - num2);}return 0;
}

Move Brackets

Thinking(Stack)

我们先找到所有的符合匹配的括号,最后就只剩下一种非法的括号了,以这种形式存在)() ()(形成)))))((((()))))((((()))))(((((这样的排列,所以我们只需要将其后面的移到前面去,或者前面的移到后面去,任选一种进行操作,因此我们的花费将会是最后无法匹配的括号的对数,也就是栈中的元素的一半。

Coding

#include <bits/stdc++.h>
#define mp make_pair
#define pb push_backusing namespace std;typedef long long ll;
typedef pair<int, int> pii;
typedef unsigned long long ull;const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-7;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')  f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (48 ^ c);c = getchar();}return f * x;
}const int N = 1e6 + 10;char str[N];int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int _; cin >> _;while(_--) {int n; cin >> n;stack<char> stk;for(int i = 1; i <= n; i++) {char temp;  cin >> temp;if(stk.empty() || stk.top() == temp || temp == '(')  stk.push(temp);else  stk.pop();}printf("%d\n", stk.size() / 2);}return 0;
}

Zero Remainder Array

Thinking

对于给定的序列,我们需要的就是x(modk)=(1,2……k−2,k−1)x \pmod k = (1, 2 …… k - 2, k - 1)x(modk)=(1,2k2,k1),这样的数,才能使我们的序列变成都是kkk的倍数,假定k=4k = 4k=4,数组中存在两个数分别为3,73, 73,7, 他们有一个共同点3(modk)=7(modk)3 \pmod k \ = 7 \pmod k3(modk) =7(modk),也就是说我们在x(modk)x \pmod kx(modk)0−>k−10 -> k - 10>k1,的一趟循环中,最多只能使其中的一个数变成ai(modk)=0a_i \pmod k = 0ai(modk)=0,想必看到这里应该就搞懂了这道题了,我们就是要找到ai(modk)a_i \pmod kai(modk)后出现的次数最多的非零数,当有多个出现次数相同的数时我们取ai(modk)a_i \pmod kai(modk)的最小值,因为那个最小值一定是当xxx足够大的时候才会满足条件。

Coding

#include <bits/stdc++.h>
#define mp make_pair
#define pb push_backusing namespace std;typedef long long ll;
typedef pair<int, int> pii;
typedef unsigned long long ull;const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-7;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')  f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (48 ^ c);c = getchar();}return f * x;
}const int N = 2e5 + 10;int a[N];int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int _ = read();while(_--) {int n = read(), k = read();for(int i = 1; i <= n; i++) {a[i] = read();a[i] %= k;}sort(a + 1, a + 1 + n, greater<int> ());int now_num = 1, ansn = a[1], num = 1;for(int i = 2; i <= n && a[i] != 0; i++) {if(a[i] == a[i - 1])  now_num++;else  now_num = 1;if(now_num >= num)  ansn = a[i], num = now_num;}if(ansn == 0){puts("0");continue;}// cout << num << " " << ansn << endl;printf("%lld\n", 1ll * k * (num - 1) + k - ansn + 1);}return 0;
}

Reading Books (easy version)

Thinking(Sort, greedy)

题意这里就不说明了,对于给定的条件,我们要同时满足AliceandBobAlice and BobAliceandBob都要读至少kkk本书,所以我们可以指定一个策略,不管这本书是AliceorBobAlice or BobAliceorBob喜欢,还是他们两同时喜欢,我们都同时增加AliceandBobAlice and BobAliceandBob的当前的书的数量,因此在之前我们就需要对书本分类AliceAliceAlice喜欢的数组a,BobBobBob喜欢的数组b,两个人都喜欢的数组c。接下来就时对这三个数组分别按照元素大小从小到大进行排序

当我们当前枚举的ai+bj<=cka_i + b_j <= c_kai+bj<=ck时我们显然贪心的选择ai,bja_i, b_jai,bj这两本书,所以我们的总花费将会变成ans+=ai+bjans += a_i + b_jans+=ai+bj,否则的话我们将会选择ckc_kck,花费将变成ans+=ckans += c_kans+=ck

当我们第一个点枚举完了后,大致存在三种情况aaa不可选,bbb不可选,ccc不可选。

所以接下来的枚举我们必须分类讨论了当a∣∣ba || bab,不可选的时候,我们要达到条件只能通过选择ccc来进行。否则的话我们就只能选择a,ba, ba,b两个组合选取了。

Code

#include <bits/stdc++.h>
#define mp make_pair
// #define pb push_backusing namespace std;typedef long long ll;
typedef pair<int, int> pii;
typedef unsigned long long ull;const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-7;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')  f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (48 ^ c);c = getchar();}return f * x;
}const int N = 2e5 + 10;struct Node {int value, fa, fb;void input() {value = read(), fa = read(), fb = read();}void out() {printf("%d %d %d\n", value, fa, fb);}bool operator < (const Node & t) const {return value < t.value;}
}a[N], b[N], c[N], in;
//结构体就是数组的用处,不用管。是我自己一开始思路想的有点复杂,然后就写了这么一个结构体。int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int n = read(), k = read(), na = 0, nb = 0, nc = 0;for(int i = 1; i <= n; i++) {in.input();if(in.fa && in.fb)  c[++nc] = in;else if(in.fa)  a[++na] = in;else if(in.fb)  b[++nb] = in;//一定要注意特判 0 0的情况。}// cout << na << " " << nb << " " << nc << endl;sort(a + 1, a + 1 + na);sort(b + 1, b + 1 + nb);sort(c + 1, c + 1 + nc);int pa = 1, pb = 1, pc = 1, flag = 0;int numa = 0, numb = 0;ll ans = 0;while(pa <= na && pb <= nb && pc <= nc) {if(a[pa].value + b[pb].value <= c[pc].value) {ans += a[pa].value + b[pb].value;pa++, pb++;}else {ans += c[pc].value;pc++;}numa++, numb++;if(numa >= k && numb >= k) {flag = 1;break;}}// cout << ans << " " << numa << " " << numb << endl;if(flag) {printf("%lld\n", ans);return 0;}if(pa > na || pb > nb) {while(pc <= nc) {ans += c[pc].value;pc++;numa++, numb++;if(numa >= k && numb >= k) {flag = 1;break;}}}else {while(pa <= na && pb <= nb) {ans += a[pa].value + b[pb].value;pa++, pb++;numa++, numb++;if(numa >= k && numb >= k) {flag = 1;break;}}}if(flag) {printf("%lld\n", ans);return 0;}puts("-1");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录用友T+接口对接的心酸历程

前言&#xff1a;公司的业务主要是对接财务系统做单据传输或者凭证处理的&#xff0c;难免少不了和各大财务软件做数据对接&#xff0c;其中当然是必须通过接口来传递数据了。于是乎&#xff0c;用友T的版本来了&#xff0c;对接的工作自然是我来做&#xff0c;可没想到就是这样…

P6327 区间加区间sin和 线段树 + 数学

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的序列aaa&#xff0c;有mmm次操作&#xff0c;每次操作分两种类型&#xff1a; (1)l,r,v(1)l,r,v(1)l,r,v&#xff0c;将al,al1,...,ara_l,a_{l1},...,a_ral​,al1​,...,ar​分别加上vvv…

集群故障处理之处理思路以及听诊三板斧(三十四)

前言 本篇主要分享一些处理故障和问题绝招&#xff0c;比如听诊三板斧&#xff1a;1&#xff09;查看日志2&#xff09;查看资源详情和事件3&#xff09;查看资源配置&#xff08;YAML&#xff09;如果还是不太好分析&#xff0c;那就祭出神器——kubectl-debug。最后&…

AC Automaton

简单复习一下字符串&#xff0c;顺便存个板子。 // Problem: P3808 【模板】AC自动机&#xff08;简单版&#xff09; // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P3808 // Memory Limit: 512 MB // Time Limit: 1000 ms // // Powered by CP Editor (http…

selenium搜狗搜图简单操作(爬取任意关键字的图片)

Picture preview Steps 这里以搜狗搜图作为一个简单的例子&#xff1a; 第一步就是获取我们的需求了&#xff0c;输入需要下载的图片名字以及需要下载的图片数量。 接下来我们需要在搜狗搜图中输入用户的需求&#xff0c;透过xpathxpathxpath锁定搜索框&#xff0c;然后输入…

Microsoft REST API指南

经过3个月的碎片时间的翻译和校验&#xff0c;由长沙.NET技术社区翻译的英文原文文档《Microsoft REST API指南 》已经翻译完成&#xff0c;现刊载前十一章如下&#xff0c;欢迎大家点击“查看原文”按钮&#xff0c;查看指南的完整内容。PS&#xff1a;内容很长&#xff0c;全…

D. Salary Changing(二分,前缀和,贪心,瞎搞)

Salary Changing Thinking 这道题第一思路就是二分&#xff0c;模拟了一下样例&#xff0c;感觉好像行于是就开始写。 对于二分&#xff0c;我们一定是二分中位数是什么&#xff0c;二分的边界对我们来说是非常重要的&#xff0c;所以我们在二分前有必要确认我们的二分边界&…

如何优雅地替换一个实现

前两天&#xff0c;我所在的项目有一个小的技术改动&#xff0c;打算把访问Redis的密码从数据库挪到配置文件里。以前的代码类似下面这样&#xff1a;用户第一次调用GetDatabase时&#xff0c;根据传入的数据库连接字符串访问数据库&#xff0c;从某个表里取出带密码的Redis连接…

莫队——三种题型

普通莫队 P3901 数列找不同 Thinking 一定是用可以用莫队来写题&#xff0c;这点是不用质疑的&#xff0c;所以那就简单了&#xff0c;只需要判断每次询问的区间是否满足r−l1numr - l 1 numr−l1num就行了。 Coding1Coding_1Coding1​ 莫队写法 #include <bits/stdc…

P5357 【模板】AC自动机(二次加强版) fail树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 这个只能搞failfailfail树了&#xff0c;让后跑一遍即可。 重复的字符串记一个&#xff0c;让后其他的都跟他一个答案即可。 // Problem: P3796 【模板】AC自动机&#xff08;加强版&…

10分钟了解一致性hash算法

应用场景当我们的数据表超过500万条或更多时&#xff0c;我们就会考虑到采用分库分表&#xff1b;当我们的系统使用了一台缓存服务器还是不能满足的时候&#xff0c;我们会使用多台缓存服务器&#xff0c;那我们如何去访问背后的库表或缓存服务器呢&#xff0c;我们肯定不会使用…

Educational Codeforces Round 114 (Rated for Div. 2) D. The Strongest Build 暴力 + bfs

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 你有nnn个装备槽&#xff0c;每个槽里面有cic_ici​个力量加成&#xff0c;对于每个槽只能选一个力量加成&#xff0c;现在给你mmm个力量组合[b1,b2,...,bn][b_1,b_2,...,b_n][b1​,b2​,...,bn​]代表这个力…

[SCOI2008]着色方案(DP)

题目链接 思想 显然我们后面的决策是跟前一步相关的&#xff0c;因此我们可以考虑DP&#xff0c;可以用一个15维的数组来进行转移&#xff0c;但是这样显然回mle&#xff0c;所以我们考虑如何压缩状态&#xff0c;由于1<Ci<51 < C_i < 51<Ci​<5&#xff0…

创业周年记:召唤神龙一周年小记

2018年8月8日&#xff0c;我决定离开腾讯的光环&#xff0c;辞职开始创业。《回顾4180天在腾讯使用C#的历程&#xff0c;开启新的征途》记录了我所说的拥有七龙珠&#xff0c;去召唤神龙&#xff0c;今天正好历时一年时间&#xff0c;非常有必要来回顾过去一年的创业历程。迎接…

1285. 单词 ac自动机 + fail树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 一篇论文由若干单词构成&#xff0c;且单词间是隔开的&#xff0c;给你nnn个单词&#xff0c;要求你计算每个单词在论文中出现了多少次。 1≤n≤2001\le n\le 2001≤n≤200&#xff0c;所有单词总长不超过1e…

Bitset瞎搞

Bitset字符匹配 Regular Number /*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc.h> #define mp make_pair #define pb push_back #define endl \nusing namespace std;typedef long long ll; typedef unsigned long lo…

「数据ETL」从数据民工到数据白领蜕变之旅(三)-除了Excel催化剂之外PowerQuery新物种同样值得期待...

在自助式BI时代以前&#xff0c;Excel级别的数据ETL工作&#xff0c;非常低效&#xff0c;动不动就要启用VBA来完成一些常见的需求&#xff0c;自带的原生功能&#xff0c;未能满足大量的繁琐数据ETL刚需功能。在Excel2010后&#xff0c;PowerQuery以插件的形式横空出现&#x…

Codeforces Round #743 (Div. 2) D. Xor of 3 模拟 + 构造

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个010101序列aaa&#xff0c;定义一次操作是选择一个[1,n−2][1,n-2][1,n−2]范围内的下表&#xff0c;将ai,ai1,ai2a_i,a_{i1},a_{i2}ai​,ai1​,ai2​都变成ai⊕ai1⊕ai2a_i\oplus a_{i1} \oplus a_…

Docker系列之烹饪披萨(二)

上一篇我们讲解了虚拟机和容器的区别&#xff0c;本节我们来讲讲Docker中关于Dockerfile、镜像、容器等基本概念。Docker是一个在容器内开发、部署、运行应用程序的平台&#xff0c;Docker本质上是容器化的代名词&#xff0c;容器对于提高软件开发和数据科学的安全性&#xff0…

线段树平方和板子

题目测试链接 代码 /*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc.h> #define mp make_pair #define pb push_back #define endl \n #define mid (l r >> 1) #define lson rt << 1, l, mid #define rson…