[codeforces] 暑期训练之打卡题(二)
每个标题都做了题目原网址的超链接
Day11《Given Length and Sum of Digits...》
题意:
给定一个数 m 和 一个长度 s,计算最大和最小在 s 长度下,各位数字之和为 m 的值
如果无法生成,则输出两个-1
题解:
需要注意:在输出最大值时,判一下 k 是否为 0
上板子:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- int main()
- {
- int len, sum; cin >> len >> sum;
- if (sum == 0 && len != 1 || sum > len * 9)
- cout << -1 << ' ' << -1 << endl;
- else
- {
- for (int i = len - 1, k = sum; i >= 0; --i)
- {
- int x = max(0, k - 9 * i);
- if (!x && i == len - 1 && k)x = 1;
- cout << x; k -= x;
- }
- cout << ' ';
- for (int i = len - 1, k = sum; i >= 0; --i)
- {
- int x = min(9, k);
- cout << x;
- k -= x;
- }
- }
- return 0;
- }
Day12《Cheap Travel》
题意:
一个 ride 需要 a 卢布,m 个 ride 需要 b 卢布,这两种方案都可以无限制地采用,要完成 n rides 最少需要多少卢布
注:由样例可知,不一定要刚好完成 n rides,可以完成 cnt rides(cnt > n)
题解:
本题我采用的分类讨论:
- 当 n <= m 时,一张多程票 b 就可以完成 n rides,故需要比较 a*n 和 b 的大小
- 当 n > m 时,比较 a 和 b/m 的价格(b/m 即为 m rides 中的单程价)
上板子:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- int main()
- {
- int n, m;
- double a, b;
- while (scanf("%d%d%lf%lf", &n, &m, &a, &b) != EOF)
- {
- int ans;
- if (n <= m) ans = (a * n > b ? b : a * n);
- else if (a >= b / m)//单程a的价格比买多程b的平均单程价格b/m高
- {
- ans = n / m * b;//尽可能购买b
- ans += min(n % m * a, b);
- }
- else ans = n * a;
- printf("%d\n", ans);
- }
- return 0;
- }
Day13《BerSU Ball》
题意:
给出两个数组,两个元素的差小于等于 1 时才能配对,问两组之间进行配对,求最多对数。
题解:
暴力出奇迹
上板子:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- int main()
- {
- vector<int>g;
- vector<int>b;
- int n, m, i, c, j, k = 0, num = 0;
- cin >> n;
- for (i = 0;i < n;i++)
- {
- cin >> c;
- b.push_back(c);
- }
- cin >> m;
- for (i = 0;i < m;i++)
- {
- cin >> c;
- g.push_back(c);
- }
- sort(g.begin(), g.end());
- sort(b.begin(), b.end());
- for (i = 0;i < n;i++)
- {
- for (j = k;j < m;j++)
- {
- if (abs(b.at(i) - g.at(j)) <= 1)
- {
- num++;
- k = j + 1;
- break;
- }
- }
- }
- cout << num << '\n';
- return 0;
- }
Day14《Pashmak and Flowers》
题意:
给出一个数组,要找一个最大值一个最小值,求最大值和最小值的差以及可以有多少种组合
题解:
- 输入数组,用 sort 排序
- 循环,记录最大值的个数,最小值的个数,差值
- 如果差值为 0,则可以有 n*(n-1)/2 种组合
- 如果不为 0,则将最大值个数和最小值个数相乘输出
坑:记得开 long long !
上板子:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int MAX = 200005;
- int a[MAX];
- int main()
- {
- int n;
- cin >> n;
- for (int i = 0;i < n;i++)
- cin >> a[i];
- sort(a, a + n);
- long long int cnt = 0;
- int ans = a[n - 1] - a[0];
- if (ans == 0)
- {
- cnt = (long long)(n - 1) * n / 2;
- }
- else
- {
- int m1 = 0, m2 = 0;
- for (int i = 0;i < n;i++)
- {
- if (a[i] == a[0])m1++;
- else break;
- }
- for (int i = n-1;i >=0;i--)
- {
- if (a[i] == a[n-1])m2++;
- else break;
- }
- cnt = (long long)m1 * m2;
- }
- cout << ans << " " << cnt << endl;
- return 0;
- }
Day15《Two Substrings》
题意:
给一个字符串,找"AB"和"BA"。
注意:"AB"和"BA"不能重合
题解:
- //strstr()函数用法
- char str[]= "1234xyz" ;
- char *str1= strstr (str, "34" );
- cout << str1 << endl;
strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。 该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。
上板子:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- char s[100001];
- int main()
- {
- char* c;
- scanf("%s", &s);
- if ((c = strstr(s, "AB")) != NULL && strstr(c + 2, "BA") != NULL)
- cout << "YES\n";
- else if ((c = strstr(s, "BA")) != NULL && strstr(c + 2, "AB") != NULL)
- cout << "YES\n";
- else cout << "NO\n";
- return 0;
- }
Day16《Random Teams》
题意:
n个人,m个队,在同一个队的人可以两两成为朋友,问朋友的对数的最大值和最小值为多少。
题解:
- 最大值的分法是有 n-1 个队中只放一个人, 把剩下的人全放同一个队。
- 最少的分法是尽可能的均分 n 个人到 m 个队。
- k个人两两之间的朋友对数为 k*(k-1)/2
坑:记得开 long long !
上板子:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- int main()
- {
- ll m, n, min, max, a, b;
- cin >> n >> m;
- max = (n - m + 1) * (n - m) / 2;
- a = n % m;
- b = n / m;
- min = (m * b * b - m * b + 2 * a * b) / 2;
- printf("%lld %lld\n", min, max);
- return 0;
- }
Day17《Cobb》
题意:
数组an,以及一个整数 k。 找到最大值 i * j − k ⋅ ( ai | aj ) i * j − k * ( ai | aj )
题解:暴力循环
- 注意减少一下循环次数,由于下标 i * j 一定大于0,故在 n 较大的时候可以不考虑下标较小的数
对于样例:
3 3
1 1 3
- f(1,2)=1⋅2−k⋅(a1|a2)=2−3⋅(1|1)=−1f(1,2)=1⋅2−k⋅(a1|a2)=2−3⋅(1|1)=−1.
- f(1,3)=1⋅3−k⋅(a1|a3)=3−3⋅(1|3)=−6f(1,3)=1⋅3−k⋅(a1|a3)=3−3⋅(1|3)=−6.
- f(2,3)=2⋅3−k⋅(a2|a3)=6−3⋅(1|3)=−3f(2,3)=2⋅3−k⋅(a2|a3)=6−3⋅(1|3)=−3.
- 最大值为f(1,2)=−1f(1,2)=−1.
记得开 long long !
上板子:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- int t, n, k, a[100005];
- int main()
- {
- cin >> t;
- while (t--)
- {
- cin >> n >> k;
- for (int i = 1; i <= n; i++)
- {
- cin >> a[i];
- }
- ll ans = -100000000;
- for (int i = max(1, n - 200); i <= n; i++)
- {
- for (int j = i + 1; j <= n; j++)
- {
- ans = max(ans, ((ll)i) * j - (a[i] | a[j]) * k);
- }
- }
- cout << ans << endl;
- }
- return 0;
- }
Day18《Same Parity Summands》
题意:
给定和n与数字个数k,问能否有k个偶数/奇数之和为n
题解:
- 若为 k 个奇数,需满足:n-(k-1) 的差为奇数
- 同理,若为 k 个偶数,需满足: n-(k-1)*2 的差为偶数
- 如果两个都不行,那么就是NO
上板子:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- int a[1000 + 10];
- int b[1000 + 10];
- int main()
- {
- int t;
- cin >> t;
- while (t--) {
- int n, k;
- cin >> n >> k;
- int num = n - (k - 1);
- if (num > 0 && num % 2 != 0) {
- cout << "YES" << endl;
- for (int i = 1; i <= k - 1; i++) cout << "1 ";
- cout << num << endl;
- continue;
- }
- num = n - (k - 1) * 2;
- if (num > 0 && num % 2 == 0) {
- cout << "YES" << endl;
- for (int i = 1; i <= k - 1; i++) cout << "2 ";
- cout << num << endl;
- continue;
- }
- cout << "NO" << endl;
- }
- return 0;
- }
Day19《Pashmak and Garden》
题意:
给出两个点 (x1,y1),(x2,y2) 问能不能构成正方形,能则输出另外两点。不能则输出 -1。
题解:
- 计算 x2-x1,y2-y1(取绝对值)
- 若有一个值为零,那么说明这两个点在同一条(与 x/y 轴平行的)直线上
- 若两个值都不为零,那么需要两个值相等(两个值代表了两条边长)
- 如果两种情况都不满足,那么输出 "-1"
因为题目很水,所以这题没有注释
上板子:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- int main() {
- int x1, y1, x2, y2;
- cin >> x1 >> y1 >> x2 >> y2;
- int lenx = abs(x1 - x2);
- int leny = abs(y1 - y2);
- if (lenx && leny && lenx != leny) printf("-1\n");
- else if (!lenx) printf("%d %d %d %d\n", (x1 + leny), y1, (x1 + leny), y2);
- else if (!leny) printf("%d %d %d %d\n", x1, y1 + lenx, x2, y1 + lenx);
- else printf("%d %d %d %d\n", x2, y1, x1, y2);
- return 0;
- }
Day20《K-th Beautiful String》
题意:
打印一个长度为 n 的字符串,原始字符串为 n-2 个 a 和最后两个 b (设 n = 4,则 str == aabb ),然后打印这个字符串第 m 个字典排序的字符串。
题解:
- 考虑用前缀和加二分查找找区间,太麻烦
- 至于规律:第一个b的位数对应m的数,找这方面的规律
- 有个坑,要开longlong
上板子:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- #define mod 998244353
- const int MAX = 1e5 + 10;
- int main(void)
- {
- int T;
- cin >> T;
- while (T--)
- {
- int n, m;
- ll x, y;
- cin >> n >> m;
- for (ll i = 1; i <= MAX; i++)
- {
- if (m <= i * (i - 1) / 2)
- {
- x = i - 1;
- break;
- }
- }
- y = m - (x * (x - 1)) / 2;
- string str(n, 'a');//建立一个全为'a'的字符串
- str[n - x - 1] = 'b';
- str[n - y] = 'b';
- cout << str << endl;
- }
- return 0;
- }
[codeforces] 暑期训练之打卡题(二)的更多相关文章
- [codeforces] 暑期训练之打卡题(一)
每个标题都做了题目原网址的超链接 Day1<Vanya and Lanterns> 题意: 一条长度为 l 的街道,在这条街道上放置了n个相同的灯,街道一端位置记为0,每个灯的位置在ai处 ...
- [codeforces] 暑期训练之打卡题(三)
每个标题都做了题目原网址的超链接 Day21<Alphabetic Removals> 题意: 给定一个字符串,要求按照字典序按照出现的前后顺序删除 k 个字母 题解: 记录字符串中各个字 ...
- [小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10
[小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10 各位看众朋友们,你们好,今天是2018年08月14日,星期二,农历七月初四,欢迎阅看今天的颓废联编节目 最近发生的灵异事件有 ...
- Noip2019暑期训练2 反思
经过两次测试,通过深刻的反思,我主要发现了以下易犯错误: 1.做题目时过于追求速度,导致好几处代码都出现手误打错的现象!而且,千万不要图快.图方便就复制粘贴,非常容易出错!(例如T3-party中直接 ...
- Codeforces Round #378 (Div. 2) D题(data structure)解题报告
题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...
- Codeforces Round #612 (Div. 2) 前四题题解
这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...
- 算法训练 Hankson的趣味题
算法训练 Hankson的趣味题 时间限制:1.0s 内存限制:64.0MB 问题描述 Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Han ...
- Codeforces 828B Black Square(简单题)
Codeforces 828B Black Square(简单题) Description Polycarp has a checkered sheet of paper of size n × m. ...
- http://codeforces.com/gym/100623/attachments E题
http://codeforces.com/gym/100623/attachments E题第一个优化它虽然是镜像对称,但它毕竟是一一对称的,所以可以匹配串和模式串都从头到尾颠倒一下第二个优化,与次 ...
随机推荐
- volist标签的各种属性
volist标签通常用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数组,可以直接使用volist标签进行输出. 在控制器中首先对模版赋值: $User = ...
- 小程序wx.getRecorderManager()录音管理
小程序中提供了两种录音的API,wx.startRecord和wx.getRecorderManager(),前一个现在微信团队已经不再维护,所以在这里写一下新的录音管理,比之前要强大 1.小程序录音 ...
- CSS简单样式练习(七)
运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...
- Azure Virtual Desktop(一)创建配置管理
一,引言 Azure 虚拟创面是一项 Azure 服务,可以让我们管理: 1)VDI(虚拟桌面基础架构) 2)云端的 RDSH:RDSH 是 RDS(远程桌面服务)中的一个角色.这些类型的服务器用于托 ...
- Intellij IDEA 2022 正式发布,这些功能真不错
Intellij IDEA 2022 正式发布了,作为正版用户,胖哥赶紧更新了一波,好家伙!这几个功能确实很香啊.新版更新的东西真不少,不愧是一个大版本更新. 依赖分析 IDEA的依赖检查.依赖冲突解 ...
- android软件简约记账app开发day01-今日收支明细的界面绘制
android软件简约记账app开发day01-今日收支明细的界面绘制 导入素材 导入在阿里iconfront图标库下载的字体图标分为大小两种,分别导入到项目目录mipmap-hdpi和mipmap- ...
- 2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意)
2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意) P1363 幻象迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 幻象迷宫可以认为是无限 ...
- 手写一个bind
1 Function.prototype.bind1 = function(){ 2 // 将类数组转化成数组 3 let arr = Array.prototype.slice.call(argum ...
- *CTF babyarm内核题目分析
本文从漏洞分析.ARM64架构漏洞利用方式来讨论如何构造提权PoC达到读取root权限的文件.此题是一个ARM64架构的Linux 5.17.2 版本内核提权题目,目的是读取root用户的flag文件 ...
- Failed to load resource: the server responded with a status of 404 ()
今天遇到了一个一开始感觉很莫名其妙的报错 在编写页面的时候把原先写在html页面里的js代码单独拿出来做成一个JavaScriptUtil文件,放在了和html页面同一个目录下.运行之后在对应的页面c ...