PAT顶级
玛珈山大萌新
破山中贼易,破心中贼难。不破不立,破而后立,立而为人。
展开
-
[PAT顶级]1023 The Best Polygon (35分)
题目: 给你一个凸包,然后让你从其定点中选n个点,使之组成的n边形面积最大 分析: 1、极角排序 2、dp[i][j][k] = dp[i][l][k - 1] (i <= l < j) + s(i, l, j) 3、用vector保存dp[i][j][k]对应的点集(除两端点) 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; //typedef __int128 lll; #define原创 2020-07-24 19:02:50 · 245 阅读 · 0 评论 -
[PAT顶级]1024 Currency Exchange Centers (35分)
分析: MST题目,不过这次题目不像之前那样先提前按权值排好序即可以,而是每次选取边权尽可能小,同时选取的center在之前尽可能出现过。先将所有的边放入优先队列,重定义<运算符,同时用一个unordered_set来保存遍历过的center,每次从队列取出来的一定就是符合题意的了(之前以为优先队列不能动态监视<运算符涉及到的容器,从而进行队列元素的自动调整,现在发现还真行) 代码: #include <bits/stdc++.h> using namespace std; type原创 2020-07-24 15:29:55 · 248 阅读 · 0 评论 -
[PAT顶级]1025 Keep at Most 100 Characters (35分)
分析: dp[i][j]表示考虑前i位,能够得到的长度为j的串的数量, dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] dp[i - 1][j - 1]代表了以s[i]结尾的长度为j的个数,显然跟dp[i - 1][j]有重合的部分,也就是dp[i - 1][j]中以s[i]结尾的长度为j的个数,所以只需要把这部分扣除就可,用last[]记录s[i]最近出现的位置。 初始化:每次初始化dp[i][1] = dp[i - 1][1] + !(s[i]之前是否出现过) 代码原创 2020-07-23 10:47:23 · 188 阅读 · 0 评论 -
[PAT顶级]1027 Larry and Inversions (35分)
题意: 给你一个排列,求分别将其子区间的数reverse之后,得到的数列的逆序对的数目。 分析: 先求出原序列的逆序对的数量,然后固定区间左端点i,移动右端点j,每次通过树状数组求[i, j]中小于a[j]的数目和大于a[j]的数目,计算本次反转对逆序对的贡献,用res记录前面几次贡献的和。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; //typedef __int128 lll; #define原创 2020-07-22 10:59:26 · 179 阅读 · 0 评论