加载中...
【cf】CodeForces Round 887(Div.2)题解 A - C
A. Desorting题意给一个数列,每次操作可以把前一部分每个数加1,后一部分每个数减1,问至少操作多少次可以让数列非递增 思路先遍历每一个数,如果有逆序的直接输出0 否则找到相邻元素最小的差值,最少的操作次数就是让这个最小的差值的两个元素变成逆序,除以2加1即可 代码#include <bits/stdc++.h>using namespace std;int main(){ int t; cin >> t; while (t -- ) { int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; i ++ ) cin >> a[i]; int l, r, minn = 0x3f3f3f3f; bool flag = true; for (int i = 1; i < n; i ++ ) { ...
【cf】CodeForces Round 886(Div.4)题解
A. To My Critics题意签到题,问输入的三个数里较大两数之和是否大于等于10 思路存进数组然后排序,取较大的两个数相加和10比较 代码#include <bits/stdc++.h>using namespace std;int main(){ int t; cin >> t; while (t -- ) { int a[3]; cin >> a[0] >> a[1] >> a[2]; sort(a, a + 3); if (a[1] + a[2] >= 10) cout << "YES\n"; else cout << "NO\n"; }} B. Ten Words of Wisdom题意每组输入两个数,判断在第一个数小于等于10的情况下,最大的第二个数的序号 思路用vector<pari<int, ...
【cf】Codeforces Round 885( Div.2)题解 A - D
A. Vika and Her Friends题目链接 题意给出矩形长宽,给出Vika所在地坐标,给出她的 k 个朋友所在地坐标,每一步他们可以到达与他们坐标相邻的地方,每轮 Vika 先走一步,她的每个朋友再走一步,如果有一轮结束后,她的任意一个朋友和她的位置重合,输出“NO”,否则输出“YES” 思路通过找规律可以发现,当 Vika 和另一个人的横竖坐标之差加起来是奇数,就不可能重合,偶数就一定有办法重合但这里应该只判断偶数,只要 Vika 与他的任意一个朋友横竖坐标之差加起来是偶数,就一定会重合 代码#include <bits/stdc++.h>using namespace std;void solve(){ int H, V; cin >> H >> V; int k; cin >> k; int x, y; cin >> x >> y; bool flag = true; for (int i = 0; i < k; i ++ ) { ...
【cf】Codeforces Round 883(Div.3)题解 A - E1
A. Rudolph and Cut the Rope思路签到题,就是看有多少个钉子上系的绳子长度比钉子高度短 代码#include <iostream>#include <algorithm>#include <vector>using namespace std;int t, n;void solve(){ cin >> n; int ans = 0; for (int i = 0; i < n; i ++ ) { int a, b; cin >> a >> b; if (b < a) ans ++ ; } cout << ans << endl;}int main(){ cin >> t; while (t -- ) { solve(); } return 0;} ...
【cf】Codeforces Round 882(Div.2)题解 A - C
A. The Man who became a God题意把一个长度为 n 的数组分成 k 段,要求每一段中相邻元素差值之和相加起来最小 思路把相邻元素的差值全部算出来排序,因为可以分成 k 段,中间有(k - 1)个间隔,所以删去最大的(k - 1)个,输出其余元素的和 代码#include <iostream>#include <algorithm>#include <vector>#include <cmath>using namespace std;const int N = 110;int t, n, k;int a[N];vector<int> b;void solve(){ cin >> n >> k; b.clear(); for (int i = 0; i < n; i ++ ) cin >> a[i]; for (int i = 1; i < n; i ++ ) b.push_back(abs(a[i] - a[i - 1])); sort(b.b ...
【C++】迭代器的用法总结
概念可以简单理解成指针定义:container<type>::iterator it; 分类可以分成输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器这里只介绍使用较多的双向迭代器和随机访问迭代器双向迭代器和随机访问迭代器都可以进行 ++、—、==、!= 的运算,但随机访问迭代器还可以进行<、>、+=x、-=x 的运算举个栗子遍历容器时,双向迭代器和随机访问迭代器都可以使用for (it = v.begin(); it != v.end(); it ++ )只有随机访问迭代器可以使用for (it = v.begin(); it < v.end(); it ++ )for (it = v.begin(); it < v.end(); it += 1 )且只有随机访问迭代器支持下标运算符,也就是把数据容器当做数组这种表示方式(e.g. a[3]) 随机访问迭代器:vector、deque 双向迭代器:set / multiset、list、map / multimap 不支持迭代器:stack、queue 辅助函数advance(it, ...
【动态规划】最长上升子序列LIS
问题的开始:最长上升子序列原题链接 给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数 N。 第二行包含 N 个整数,表示完整序列。 输出格式 输出一个整数,表示最大长度。 数据范围 $1≤N≤1000,$$−109≤数列中的数≤109$ 输入样例73 1 2 1 8 5 6输出样例4 思路 代码#include <bits/stdc++.h>using namespace std;const int N = 1010;int n;int a[N], f[N];int main(){ cin >> n; for (int i = 1; i <= n; i ++ ) cin >> a[i]; for (int i = 1; i <= n; i ++ ) { f[i] = 1; for (int j = 1; j < i; j ++ ) if (a[j] < a[i]) f[i] = f[j ...
【动态规划】数字三角形
摘花生题目链接 Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。 地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。 Hello Kitty只能向东或向南走,不能向西或向北走。 问Hello Kitty最多能够摘到多少颗花生。 输入格式 第一行是一个整数T,代表一共有多少组数据。 接下来是T组数据。 每组数据的第一行是两个整数,分别代表花生苗的行数R和列数 C。 每组数据的接下来R行数据,从北向南依次描述每行花生苗的情况。每行数据有C个整数,按从西向东的顺序描述了该行每株花生苗上的花生数目M。 输出格式 对每组输入数据,输出一行,内容为Hello Kitty能摘到得最多的花生颗数。 数据范围 $1≤T≤100,$$1≤R,C≤100,$$0≤M≤1000$ 输入样例22 21 13 42 32 3 41 6 5输出样例816 题意从左上角走到右下角,求走过的交点最大权值和 思路f[i][j]表示到达(i,j)点权重的最大值 因为只能向右走或向下走,所以到 ...
【动态规划】计数DP
例题 - 整数划分题目在这里 题目一个正整数 n 可以表示成若干个正整数之和,形如:n=n1+n2+…+nk,其中 n1≥n2≥…≥nk,k≥1。 我们将这样的一种表示称为正整数 n 的一种划分。 现在给定一个正整数 n,请你求出 n 共有多少种不同的划分方法。 输入格式 共一行,包含一个整数 n。 输出格式 共一行,包含一个整数,表示总划分数量。 由于答案可能很大,输出结果请对 109+7 取模。 数据范围 1 ≤ n ≤ 1000 输入样例5输出样例7 解法这个问题可以转化成完全背包问题从1 - n 中选物品,每种物品有无数个,背包容量 n 状态方程:f[i][j]意为从1 - i中选,合为j的情况f[i][j] = f[i - 1][j] + f[i][j - i] + f[i][j - 2 * i] + … + f[i][j - s * i] ;(意思就是不选 i + 选一个 i + 选两个 i + ……)f[i][j - 1] = f[i - 1][j - i] + f[i][j - 2 * i] + … + f[i][j - s * i]发现这个式子和前面的式子后半部分重合 ...
【动态规划】区间DP
例题:石子合并题目在这里 题目设有 N 堆石子排成一排,其编号为 1,2,3,…,N。 每堆石子有一定的质量,可以用一个整数来描述,现在要将这 N 堆石子合并成为一堆。 每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。 例如有 4 堆石子分别为 1 3 5 2, 我们可以先合并 1、2 堆,代价为 4,得到 4 5 2, 又合并 1、2 堆,代价为 9,得到 9 2 ,再合并得到 11,总代价为 4+9+11=24; 如果第二步是先合并 2、3 堆,则代价为 7,得到 4 7,最后一次合并代价为 11,总代价为 4+7+11=22。 问题是:找出一种合理的方法,使总的代价最小,输出最小代价。 输入格式 第一行一个数 N 表示石子的堆数 N。 第二行 N 个数,表示每堆石子的质量(均不超过 1000)。 输出格式 输出一个整数,表示最小代价。 数据范围 1 ≤ N ≤ 300 输入样例41 3 5 2 输出样例22 解法状态方程:f[i][j]表示合并完区间 [i, j] 时的最小价值状态 ...