判断通过操作能否让字符串相等 I
同下。
判断通过操作能否让字符串相等 II
模拟。也可以手动比较,就是适用性不好。(PS:想出一个写法,结果被自己 Hack 掉了~)
1 | class Solution { |
几乎唯一子数组的最大和
滑动窗口。
1 | class Solution { |
统计一个字符串的 k 子序列美丽值最大的数目
因为和选择的顺序没有关系,所以贪心的选择出现次数最大的字母就行。
1 | class Solution { |
同下。
模拟。也可以手动比较,就是适用性不好。(PS:想出一个写法,结果被自己 Hack 掉了~)
1 | class Solution { |
滑动窗口。
1 | class Solution { |
因为和选择的顺序没有关系,所以贪心的选择出现次数最大的字母就行。
1 | class Solution { |
模拟。
1 | public static void solve() { |
比赛时没什么思路,想到扫描线,就用扫描线 + 区间合并来做了。结果一看题解,暴力标记每个点,没想到。
1 | public static void solve() { |
看到大佬的解法后,感觉我模拟的方式好蠢啊。当时我是枚举是否要买 张票,有点麻烦,原来枚举买当日的票更简单。
1 | public static void solve() { |
动态规划有点不太会,赛时瞎搞 AC 的。记忆化搜索会很好写,然后 DP 的话,我是用三层循环解决的,下面的解法优化掉一层循环。
1 | public static void solve() { |
比较显然的做法是把相同的数分为一组,然后组内枚举中间的数。对于每个中间的数,让答案加上 ,其中 和 分别是左右两边相等的数的个数,枚举时可以一次性枚举间隔内所有数。
第二个解法是参考大佬的代码得到的,相当于枚举右端点吧。对于每个右端点,它的贡献可以根据下面代码中的公式得出,感觉比较巧妙。
1 | public static void solve() { |
有点抽象,不是很懂。大概是枚举了 个极限位置,然后分别对每个位置判断可行性。
1 | public static void solve() { |
Educational Codeforces Round 154 (Rated for Div. 2)
从 到 的序列中删除一些数(至少保留两位),使得结果为质数。可以发现 和 都是质数,所以判断 和 的先后顺序,然后输出即可。
1 | public static void solve() { |
比赛时我是从左往右遍历记录不相等的数量,如果有不相等的,那么就需要一个 ,否则遇到 就输出 YES。和正解的思路是一样的,就是麻烦一点。正解是有相同的 出现时就输出 YES。
1 | public static void solve() { |
比较简单的写法就是用一个标记数组做记录,递增会向左传递,递减会向右传递,然后判断是否冲突即可。更进一步观察,可以发现只需要记录最大的递增位置,和最小的递减位置。
1 | public static void solve() { |
没想到啊。枚举负数前缀的长度:在负数前缀中,如果 ,就需要操作一次;在正数后缀中,如果 就需要操作一次。(下面的代码很妙啊,不需要加额外的判断语句。)
1 | public static void solve() { |