Educational Codeforces Round 103 (Rated for Div. 2)前四题
Educational Codeforces Round 103 (Rated for Div. 2)
第二次被别人hack,悲
A - K-divisible Sum
题意
给定两个整数 n,kn,kn,k,要求你建成一个正整数数组 aaa,满足 (a1+a2+…+an)(a_1 + a_2 + … + a_n)(a1+a2+…+an) 能够被 kkk 整除,且使max(ai)max(a_i)max(ai) 最小,输出 min(max(ai))min(max(a_i))min(max(ai)) 。
思路
把 kkk 均匀的分到 nnn 个数里即可。如果 n>kn \gt kn>k,则找到比 nnn 大的最小的 kkk 的倍数,作为数组的总和;如果 n≤kn \leq kn≤k,则以 kkk 作为数组的总和。那么答案就是 (sum / n) + (sum % n) ? 1 : 0
。
这题被hack了,,,太大意了,用了while
循环来求比 nnn 大的最小的 kkk,没考虑最坏情况1e9。
代码
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define PI acos(-1)
using namespace std;
typedef pair<int, int> P;
typedef long long ll;
const int N = 1e6 + 9;
const ll mod = 1e9 + 7;int main()
{int T;scanf("%d", &T);while(T--){ll k, n;scanf("%lld%lld", &n, &k);if(n > k){ ll kk = n / k;if(n % k)kk++;k = kk * k;}ll ans = k / n;if(k % n)ans++;printf("%lld\n", ans);}
}
B - Inflation
题意
给定与商品价格相关的数组 ppp,其中 p0p_0p0 代表商品的最初价格,pi(i∈[1,n−1])p_i \ (i \in [1, n - 1])pi (i∈[1,n−1])代表第 iii 天的时候,价格比前一天增长多少。现在要你修改数组中一部分元素的值,使得在每个元素都依然是整数的前提下,每天的增长率都小于给定的 kkk,且修改总量最少。(增长率 = 当天增长的值 / 增长前的价格)
思路
每次都加 p0p_0p0 上是最好的选择。第 kkk 天增长前的价格 pricek=∑i=0k−1piprice_k = \sum_{i = 0}^{k - 1} p_ipricek=∑i=0k−1pi,所以增长率 K=pk∑i=0k−1piK = \frac{p_k}{\sum_{i = 0}^{k - 1} p_i}K=∑i=0k−1pipk,而理想的 k≥pk∑i=0k−1pik \geq \frac{p_k}{\sum_{i = 0}^{k - 1} p_i}k≥∑i=0k−1pipk,所以 k⋅∑i=0k−1pi≥pkk · \sum_{i = 0}^{k - 1} p_i \geq p_kk⋅∑i=0k−1pi≥pk。若 k⋅∑i=0k−1pi<pkk · \sum_{i = 0}^{k - 1} p_i \lt p_kk⋅∑i=0k−1pi<pk ,则必然需要加上 pk−k⋅∑i=0k−1pip_k - k · \sum_{i = 0}^{k - 1} p_ipk−k⋅∑i=0k−1pi 的值。对这些必须要加的值进行累加(是累加而不是最大,这是现场犯的错误,可以仔细思考一下),就能得到最终答案。
代码
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define PI acos(-1)
using namespace std;
typedef pair<int, int> P;
typedef long long ll;
const int N = 1e6 + 9;
const ll mod = 1e9 + 7;ll a[500];int main()
{int T;scanf("%d", &T);while(T--){ll k, n;ll maxs = 0;scanf("%lld%lld", &n, &k);scanf("%lld", a);ll sum = a[0] * k;for(int i = 1; i < n; i++){scanf("%lld", a + i);ll exsum = a[i] * 100;//cout << exsum << ' ' << sum << endl;if(exsum > sum){maxs += (exsum - sum);sum = exsum;}sum += a[i] * k;}ll ans = maxs / k;if(maxs % k)ans++;printf("%lld\n", ans);}
}
C - Longest Simple Cycle
题意
有 nnn 条链,第 iii 条链上有 cic_ici 个结点,除第一条链外,每条链的第一个结点都和前一个链的第 aia_iai 个结点相连,每条链的最后一个结点都和前一个链的第 bib_ibi 个结点相连。定义simple cycle为首尾相连(环)且遍历此环路恰好每个点经过且经过一次的环,问这 nnn 条链能形成的最长的环路是多少长?
思路
参考:Educational Codeforces Round 103 (Rated for Div. 2) 【A,B,C】题解
把左半边环路和右半边环路分开看,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mRxrBjgD-1612017280327)(C:\Users\29039\AppData\Roaming\Typora\typora-user-images\image-20210130222808554.png)]
分别贪心取最长即可。具体代码中体现。
代码
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define PI acos(-1)
using namespace std;
typedef pair<int, int> P;
typedef long long ll;
const int N = 3e5 + 19;
const ll mod = 1e9 + 7;ll a[N];
ll b[N];
ll c[N];int main()
{int T;scanf("%d", &T);while(T--){int n;scanf("%d", &n);for(int i = 0; i < n; i++){scanf("%lld", c + i);}for(int i = 0; i < n; i++){scanf("%lld", a + i);}ll maxx = 0;ll cnt = 0;for(int i = 0; i < n; i++){scanf("%lld", b + i);if(i == 0)continue;ll top = a[i];ll bot = b[i];if(top > bot){ll tmp = bot;bot = top;top = tmp;}if(i == 1){cnt = bot - top + 2;}else{if(top == bot){cnt = 2;}else{cnt = max(top - 1 + c[i - 1] - bot + cnt + 2, bot - top + 2);}}maxx = max(maxx, cnt + c[i] - 1);}printf("%lld\n", maxx);}
}
D - Journey
题意
有 n+1n + 1n+1 个城市,有 nnn 条路将他们相连,L表示只能从右往左走,R表示只能从左往右走,从一个地方出发,到达相邻城市后,所有路的方向都会变为反方向。求除从所有的城市出发,最多能经过多少不重复的城市?
思路
我只要能往左边走,我肯定能回到原点,右边同样,所以:往左可以走到多少城市+往右可以走多少城市+自己=最终答案;
第二,只讨论往左走的情况,第 iii 个城市可以由第 i−2i-2i−2 个城市推过来。如果我能走到第i-2个城市,那么第 iii 个城市往左能经过的城市个数 = 第 i−2i-2i−2 个城市往左走能经过的城市个数 +2+2+2 ;如果不能走到第 i−2i-2i−2 个城市,那么看看能不能走到第 i−1i-1i−1 个,能走到就是 111 个,不能就是 000 个
最左的城市不能在往左走,所以是 000 个(指除自己以外);倒数第二左的城市,如果第一条路是L,那么他能到达一个城市(即最左边的城市),否则 000 个。往右走的情况以此类推。
代码
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define PI acos(-1)
using namespace std;
typedef pair<int, int> P;
typedef long long ll;
const int N = 3e5 + 19;
const ll mod = 1e9 + 7;char s[N];int L[N];
int R[N];int main()
{int T;scanf("%d", &T);while(T--){int n;scanf("%d", &n);scanf("\n%s", s);L[0] = 0;if(s[0] == 'L')L[1] = 1;elseL[1] = 0;for(int i = 1; i <= n; i++){if(s[i - 1] == 'L'){if(s[i - 2] == 'R'){L[i] = L[i - 2] + 2;}else{L[i] = 1;}}else{L[i] = 0;}}R[n] = 0;if(s[n - 1] == 'R')R[n - 1] = 1;elseR[n - 1] = 0;for(int i = n - 2; i >= 0; i--){if(s[i] == 'R'){if(s[i + 1] == 'L'){R[i] = R[i + 2] + 2;}else{R[i] = 1;}}else{R[i] = 0;}}for(int i = 0; i < n; i++){printf("%d ", L[i] + R[i] + 1);}printf("%d\n", L[n] + R[n] + 1);}
}
总结
- BD都犯简单错误,说明不仔细,且练的太少了不熟练;
- A题居然加了一个能被O(1)替代的1e9while循环在里面,当时脑子真的不清醒。。。
- 真是一手好牌打烂,A题不小心被hack,C题赛场上能出却心急了小错误没看出来,本来妥妥的1500变成1400。希望下次能静下心来,好好比赛。
- 其实edu场确实以前打的很少,那么算是明白一些教训了,这open hacking确实不是闹着玩的,官方的数据量一小hackers就狂喜,,,以后做题还是要小心谨慎
多多包涵,共同进步
Educational Codeforces Round 103 (Rated for Div. 2)前四题相关推荐
- Educational Codeforces Round 103 (Rated for Div. 2)A~E解题报告
Educational Codeforces Round 103 (Rated for Div. 2) A. K-divisible Sum 原题信息 解题思路 AC代码 #include <b ...
- Educational Codeforces Round 103 (Rated for Div. 2)
Educational Codeforces Round 103 (Rated for Div. 2) http://codeforces.com/contest/1476 A K-divisible ...
- Educational Codeforces Round 103 (Rated for Div. 2) D. Journey dp
传送门 题意: 给n+1n+1n+1个点,每两个点之间有一个字符L(表示i+1连向i)L(表示i+1连向i)L(表示i+1连向i)或者R(表示i连向i+1)R(表示i连向i+1)R(表示i连向i+1) ...
- Educational Codeforces Round 100 (Rated for Div. 2)补题记录
总结:感觉这个educational场好难啊(蒟蒻视角),又被虐了,唉 A. Dungeon 每一枪会造成1点伤害对一个单位,但是当开7的倍数枪时会造成3点伤害 每7次一个轮回,一个完整的轮回共造成9 ...
- Educational Codeforces Round 133 (Rated for Div. 2) D题
题目链接:Problem - D - Codeforces 一道非常经典的完全背包求方案数题: 首先先写好我们的状态转移方程,那什么代表体积,什么代表物品数目呢: 其实很清晰k, k + 1 ... ...
- codeforces Educational Codeforces Round 49 (Rated for Div. 2) C题
刚开始拿到这题很懵逼,知道了别人的思路之后开始写,但是还是遇到很多坑,要求求P2/S最大.p=a b.就是求(a2+ b2 +2ab)/ab最大,也就是a/b +b/a最大.那么题意就很明显了. 但是 ...
- Educational Codeforces Round 119 (Rated for Div. 2) 做题日志
A Equal or Not Equal 题意 给你一个字符串, s i = = E si == E si==E表示 a ( i ) = = a ( i + 1 ) a(i) == a(i+1) a( ...
- Educational Codeforces Round 33 (Rated for Div. 2) B题
B. Beautiful Divisors Recently Luba learned about a special kind of numbers that she calls beautiful ...
- Educational Codeforces Round 131 (Rated for Div. 2)刷题记录OR题解
题解 A Grass Field 题面翻译 给出一个 2×22 \times 22×2 的矩阵,矩阵的值都是 000 和 111,定义一次操作:选择一个点,将其所在的行和列的点的值全部修改为 000, ...
最新文章
- 深究AngularJS——排序
- Java堆内存溢出代码示例
- 八十四、SpringBoot微服务Dubbo和Zookeeper分布式
- DRF的序列化——Serializers 序列化组件
- C++学习——构造函数,析构函数与虚函数关系
- 中国分省市地图导航-SVG格式(基于Raphaël)
- 【more effective c++读书笔记】【第5章】技术(5)——Reference counting(引用计数)(2)...
- ansible 第三次作业
- python吃显卡还是内存条_用游戏本打游戏是显卡重要还是内存重要?
- 逆向研究QCA9563固件,查看和修改GPIO定义
- 简单有限元分析技术(详细步骤讲解)
- AT&T拟利用电力线网络提供无线宽带服务
- FOXIT PDF EDITOR工具分割PDF
- MIMO-OFDM学习笔记(传播与衰落)
- 集成学习-Bagging和Pasting
- 2步迁移PC端微信聊天记录
- mysql嵌套select_select 嵌套查询
- 只做自己擅长的事——博发传媒
- 科研院所网管开发项目案例分析
- java千万级数据txt文件导入数据库