- 博客(24)
- 收藏
- 关注
原创 洛谷 P3620 - P3621 数据备份、风铃、动物园(APIO 2007)
洛谷 P3620 - P3622 数据备份、风铃、动物园(2007 APIO)P3620 数据备份题目描述:思路:我们先来将这道题简化一下:将每一对相邻的建筑之间的空地看作一个点,点的权值即为两个建筑物之间的距离。那么题意可以转化为:在这n - 1个点中选出两两不相邻的k个点,使得这k个点的权值之和最小。这样简化完题意之后,我们就可以很轻松地解决这个问题了。首先,我们来看一下一个错误思路。错误思路:直接将所有点存入小根堆中,每一次取出堆顶元素并将堆顶元素左右两边的元素删除,最后求得最
2022-03-24 20:20:55
282
原创 洛谷 P6187 最小环
洛谷 P6187[2020 NOI Online 提高组] 最小环题目描述:思路:首先,我们先随便选一组n和k,来画图理解一下本题的题意。如图,我们以n = 10, k = 4的情况为例,先从1号点开始“跳”,每次向后跳4个数,这样就形成的图中红色五角星的路径。但是此时仍有一些数没有被走到过,因此我们又从2号点开始“跳”,跳完一个五角星后刚好把所有数都走到了一次。根据上面的模拟,我们可以发现:将所有数围成一个环,那么我们只需要以若干个不同的数为起点,每次向后跳k个数地走,便可以走出若干个环,
2022-03-18 22:07:13
188
原创 洛谷 T3275 糖果
题目描述:思路:这道题可以用差分约束来做。既然是用差分约束,那么我们就要先找不等关系。题目很贴心,直接为我们一条条列好了五种情况。我们只需要把它们转化为式子即可。由于我们要求最小值,所以要使用最长路径,即将所有关系用">="号连接。①X = 1时,A == B,所以A >= B且B >= A;②X = 2时,A < B,所以B >= A + 1;③X = 3时,A >= B;④X = 4时,A > B,所以A >= B + 1;⑤X = 5时
2022-03-15 14:04:05
165
原创 洛谷 T6476 涂色游戏
题目描述:思路:10^20个格子,乍一看很多,但是仔细一想就会发现,这些格子中的颜色以p1和p2的最小公倍数为周期循环出现。所以我们只需要关注一个循环中的情况即可。不妨设p1 < p2,那么在[0, p2]这个区间上就会有这样的场景:不难想到,我们可以比较一个大周期中的以p2为一个循环的小周期中的p1个数和k的大小来来判断答案。即判断:(p2 - 1) / p1 __ k但是根据上图,我们又不难看出,将所有的p1向右平移一个单位长度,原本在“0”上的p1就会加入p1的总数中去。也就是说
2022-03-12 16:35:06
4648
原创 2022.3.3图论水题
2022.3.3图论水题1.灾后重建题目描述:思路:题目中有两个非常重要的信息:1.数据保证了输入每一座村庄重新修建的时间时会从小到大输入。2.数据保证了输入每一次询问时询问的时间会从小到大输入。也就是说,假设我们用来存储每一座村庄的重新修建时间的数组为t,那么t天生就时有序的数组。所以,在每一次询问时,假设最后一个重新修建时间小于等于询问的时间的村庄编号为k,那么本次询问中能够走到的村庄就只有前k个。根据floyd算法中第一层循环“只经过编号小于等于k的点”的定义,我们此时只需要对前k
2022-03-03 19:44:08
210
原创 2022.2.26解题报告
2022.2.26解题报告今天的题目比较水。T1.特殊年份题目描述:思路:直接按照题意判断,输出答案即可。代码:#include <iostream>#include <algorithm>#include <cstring>using namespace std;int cnt = 0;int main() { for (int i = 0 ; i < 5 ; i ++ ) { int a; scanf("%d", &
2022-02-27 13:16:49
116
原创 2022.2.25解题报告
2022.2.25解题报告T1.划拳题目描述:思路:直接按照题意模拟一边遍即可。代码:#include <iostream>#include <cstring>#include <algorithm>using namespace std;int n;int ans1, ans2;int main() { scanf("%d", &n); while (n -- ) { int a, b; scanf("%d%d", &a
2022-02-26 10:37:42
216
原创 2022.2.18解题报告
2022.2.18解题报告T1.切蛋糕题目描述:思路:首先,我们先来看一下最少用几刀就可以解决所有情况。对于一个蛋糕,要分成至少三块,那么最少都要2刀,因为0刀或1刀分出的蛋糕数量都小于3。那么,两刀能不能做到呢?我们来看下面这张图:由于一共只有4块蛋糕而且要分给3个人,所以一定是2个人拿到1块,1个人拿到2块。不妨设a和b拿到了1块,且a拿走了上图中A部分,则b只有B和C处两种选择。①如果b拿走了B部分,那么就有a = b的结论,这显然只是一种片面的情况,无法解决所有情况。②如果b
2022-02-18 17:19:39
220
原创 2022.2.11解题报告
2022.2.11解题报告T1.智力测试题题目描述:思路:对于列和行来说,它们均为以n为周期,在1~n中周期性地出现。故时间对n取余再加一(因为是从(1, 1)开始的)就是列数,对n取商再取余再加一就是行数(因为直接取商是经过的行数,有可能大于n,即走过了整张图又回到(1, 1)的情况)。代码:#include <iostream>#include <cstring>#include <algorithm>using namespace std;i
2022-02-11 21:34:06
582
原创 2022.2.10图论一题
题目描述:思路:为了在选择了最多k条边之后使得剩下的边中的最大值最小,我们在每次确定了一条路后,应当每一次都选择路上权值最大的边,将其纳入免费的k条边中。所以,假设路上的边数>k,那么我们一定会选择这条路上的最大的k个数纳入免费的集合中。故剩下的边中最大的就是这条路上所有边中第k + 1大的数。那么这道题就转化为了求每一条1~n的路上第k + 1大的数的最小值。看到这种形式,我们就会想到用二分。而使用二分需要满足以下的性质:对于数列中一个元素x,它可以将整个数列分割成左右两个有着不同性质
2022-02-10 19:21:27
140
原创 2022.2.10解题报告
2022.2.10 解题报告1.异或题目描述:思路:直接打擂台找最大值然后异或一下即可。代码:#include <iostream>using namespace std;const int N = 20;int n, a[N], maxx;int main() { scanf("%d", &n); for (int i = 1 ; i <= n ; i ++ ) { scanf("%d", a + i); maxx = max(maxx, a[
2022-02-10 11:49:19
907
原创 2022.2.9解题报告
2022.2.9解题报告1.字符串比较题目描述:https://www.acwing.com/problem/content/description/4215/思路:由于不论大小写,所以先把所有字符串都转为小写再直接比较即可。代码:#include <iostream>using namespace std;void change_s(string &a) { for (int i = 0 ; i < a.length() ; i ++ ) if (a[i
2022-02-09 12:11:42
323
原创 2022.2.6解题报告
2022.2.6解题报告1.平衡数组题目描述:https://www.acwing.com/problem/content/3781/思路:假设一个长度为n的数组:1,2,3,4,… n - 1, n再假设它最后都变成相等的值为k:k,k,k,k,… k,k那么每一个数变成k所要加的值就分别为:k - 1,k - 2,k - 3,k - 4 … k - n + 1,k - n再假设一共经过m次操作,那么每个数实际加上的数值应为:m*(m + 1) / 2 - 不给该数加值的操作的序号
2022-02-07 12:50:52
513
原创 2022.1.21 解题报告
解题报告1.最短时间题目描述:https://www.acwing.com/problem/content/3663/思路:因为是按照最佳行进方式行进,所以只需要判断四个顶点到(r,c)的距离最大值即可。代码:#include<iostream>using namespace std;int main(){ int T; int ans; scanf("%d",&T); while(T -- ){ int n,m,r,c;
2022-01-21 12:31:06
731
原创 2022.1.20 解题报告
解题报告1.A还是B题目描述:https://www.acwing.com/problem/content/3697/思路:直接暴力枚举即可。代码:#include<iostream>using namespace std;const int N = 1e5 + 10;char str[N];int n;int main(){ int cnt = 0; scanf("%d",&n); cin >> str; for(in
2022-01-20 21:55:39
852
原创 2022.1.20解题报告
2022.1.20解题报告1.三元一次方程题目描述:https://www.acwing.com/problem/content/description/3629/思路:直接两层循环,暴力枚举x和y即可。代码:#include<iostream>using namespace std;int t,n;int main(){ scanf("%d",&t); while(t -- ){ scanf("%d",&n);
2022-01-20 15:26:14
474
原创 2022.1.19 解题报告
解题报告1.特殊数字题目描述:https://www.acwing.com/problem/content/3550/思路:由于数据很小,那么直接从n往后暴力枚举即可。代码:#include<iostream>using namespace std;int n;int main(){ scanf("%d",&n); for(int i = n ; ; i ++ ){ int x = i,num = 0; //num表示x各个位数上的数
2022-01-19 22:19:50
191
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人