<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Charles6665的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Charles6665</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Charles6665]]></copyright><item><title><![CDATA[【无标题】23]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/124356643</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/124356643</guid><author>Charles6665</author><pubDate>Fri, 22 Apr 2022 22:39:30 +0800</pubDate><description><![CDATA[https://bbs.youkuaiyun.com/topics/360190372?list=12868977
zhaobudaohe

]]></description><category></category></item><item><title><![CDATA[5538. 统计子树中城市之间最大距离]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/109014289</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/109014289</guid><author>Charles6665</author><pubDate>Sun, 11 Oct 2020 17:26:52 +0800</pubDate><description><![CDATA[传送门

解题思路：枚举子集，每次枚举都先判断是否可以相互到达。
主要是判断方法：
若a,b,c,d,e,…,z可以相互到达，那么必存在一个点，去除这个点后剩下点可以相互到达，且这个点与剩下的这些点中至少一个相连接。
class Solution {
public:
    bool vis[20][20];
    int dis[20][20];
    int sum[20];
    int dp[(1&lt;&lt;15)+10];
    void check(vector&lt;int&gt;]]></description><category></category></item><item><title><![CDATA[5514. 检查字符串是否可以通过排序子字符串得到另一个字符串]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/108568790</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/108568790</guid><author>Charles6665</author><pubDate>Sun, 13 Sep 2020 21:47:28 +0800</pubDate><description><![CDATA[给你两个字符串 s 和 t ，请你通过若干次以下操作将字符串 s 转化成字符串 t ：
选择 s 中一个 非空 子字符串并将它包含的字符就地 升序 排序。
比方说，对下划线所示的子字符串进行操作可以由 “14234” 得到 “12344” 。
如果可以将字符串 s 变成 t ，返回 true 。否则，返回 false 。
一个 子字符串 定义为一个字符串中连续的若干字符。
解题思路：
参考大佬的思路：
我们可以发现任意两个数a[i],a[j],若a[i]&lt;aj，无论怎么变，a[i]都不能到a[j]后去]]></description><category></category></item><item><title><![CDATA[LCP 15:秋叶收藏集(动态规划||前缀和)]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/108568581</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/108568581</guid><author>Charles6665</author><pubDate>Sun, 13 Sep 2020 21:33:32 +0800</pubDate><description><![CDATA[小扣出去秋游，途中收集了一些红叶和黄叶，他利用这些叶子初步整理了一份秋叶收藏集 leaves， 字符串 leaves 仅包含小写字符 r 和 y， 其中字符 r 表示一片红叶，字符 y 表示一片黄叶。
出于美观整齐的考虑，小扣想要将收藏集中树叶的排列调整成「红、黄、红」三部分。每部分树叶数量可以不相等，但均需大于等于 1。每次调整操作，小扣可以将一片红叶替换成黄叶或者将一片黄叶替换成红叶。请问小扣最少需要多少次调整操作才能将秋叶收藏集调整完毕。
示例 1：
输入：leaves = “rrryyyrryyyr]]></description><category></category></item><item><title><![CDATA[旅行（最大生成树）]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/108547024</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/108547024</guid><author>Charles6665</author><pubDate>Sat, 12 Sep 2020 11:18:15 +0800</pubDate><description><![CDATA[DK 有一个无向图 G，这个无向图有 n 个点 m 条边

参考出题人的题解：
可以发现，对答案有贡献的边肯定是最大生成树上的边，那么可以将这些边先拉出来，用kural算法求最大生成树即可。
#include&lt;bits/stdc++.h&gt;
using namespace std;
typedef long long ll;

int n,m;
struct Node{
	int u,v,val;
	friend bool operator &lt;(const Node&amp; a,const]]></description><category></category></item><item><title><![CDATA[306-累加数]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/108532135</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/108532135</guid><author>Charles6665</author><pubDate>Fri, 11 Sep 2020 12:52:26 +0800</pubDate><description><![CDATA[累加数是一个字符串，组成它的数字可以形成累加序列。
一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外，字符串中的其他数都等于它之前两个数相加的和。
给定一个只包含数字 ‘0’-‘9’ 的字符串，编写一个算法来判断给定输入是否是累加数。
说明: 累加序列里的数不会以 0 开头，所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
示例 1:
输入: “112358”
输出: true
解释: 累加序列为: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3]]></description><category></category></item><item><title><![CDATA[10.正则表达式]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/108478148</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/108478148</guid><author>Charles6665</author><pubDate>Tue, 08 Sep 2020 21:59:23 +0800</pubDate><description><![CDATA[给你一个字符串 s 和一个字符规律 p，请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素
所谓匹配，是要涵盖 整个 字符串 s的，而不是部分字符串。
说明:
s 可能为空，且只包含从 a-z 的小写字母。
p 可能为空，且只包含从 a-z 的小写字母，以及字符 . 和 *。
示例 1:
输入:
s = “aa”
p = “a”
输出: false
解释: “a” 无法匹配 “aa” 整个字符串。
示例 2:
输入:
s = “aa”]]></description><category></category></item><item><title><![CDATA[组合]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/108477829</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/108477829</guid><author>Charles6665</author><pubDate>Tue, 08 Sep 2020 21:38:33 +0800</pubDate><description><![CDATA[给定两个整数 n 和 k，返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
解题思路：一开始虽然知道是暴搜，但是由于在每次dfs过程中都用了一个for循环控制搜索，结果会导致有重复，其实只需要每次dfs过程中枚举当前这位选还是不选即可。
class Solution {
public:
    vector&lt;vector&lt;int&gt;&gt; p;
  ]]></description><category></category></item><item><title><![CDATA[前k高频元素]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/108446008</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/108446008</guid><author>Charles6665</author><pubDate>Mon, 07 Sep 2020 13:14:24 +0800</pubDate><description><![CDATA[给定一个非空的整数数组，返回其中出现频率前 k 高的元素。
传送门
你可以假设给定的 k 总是合理的，且 1 ≤ k ≤ 数组中不相同的元素的个数。
你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
题目数据保证答案唯一，换句话说，数组中前 k 个高频元素的集合是唯一的。
你可以按任意顺序返回答案。
思路：按照大佬思路：用最小堆，将堆内元素个数维护成k，每次加入元素的出现次数与最小堆堆顶比较，若大于则将堆顶元素出堆，加入该元素。
class Solution {
public:
 ]]></description><category></category></item><item><title><![CDATA[预测赢家(博弈论，动态规划)]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/108335054</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/108335054</guid><author>Charles6665</author><pubDate>Tue, 01 Sep 2020 10:00:26 +0800</pubDate><description><![CDATA[思路：动态规划：这里我们定义dp[i][j]为[i,j]中玩家1比玩家2最多能获得的分数.
首先直观可知dp[i][i]=nums[i].
[i,j]区间内玩家有两种操作方式：
1.先拿nums[j]，玩家1获得了nums[j].此时dp[i][j-1]就是玩家2比玩家1最多能获得的分数,此时玩家1比玩家2最多能获得的分数就是nums[j]-dp[i][j-1]
2.先拿nums[i]，玩家1获得了nums[i].此时dp[i+1][j]就是玩家2比玩家1最多能获得的分数,此时玩家1比玩家2最多能获得的分.]]></description><category></category></item><item><title><![CDATA[钓鱼]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/108331009</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/108331009</guid><author>Charles6665</author><pubDate>Mon, 31 Aug 2020 22:32:50 +0800</pubDate><description><![CDATA[链接
在一条水平路边，有n个钓鱼湖，从左到右编号为1,2,…,n。佳佳有H个小时的空余时间，他希望利用这个时间钓到更多的鱼。他从1出发，向右走，有选择的在一些湖边停留一定的时间（是5分钟的倍数）钓鱼。最后在某一个湖边结束钓鱼。佳佳从第i个湖到第i+1个湖需要走5\times T_i5×T
i
​	
分钟路，还测出在第i个湖停留，第一个5分钟可以钓到F_iF
i
​	
条鱼，以后每再钓5分钟，可以钓到的鱼量减少D_iD
i
​	
，若减少后的鱼量小于0，则减少后的鱼量为0。为了简化问题，佳佳假定没有其他人钓鱼]]></description><category></category></item><item><title><![CDATA[家庭作业]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/108330929</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/108330929</guid><author>Charles6665</author><pubDate>Mon, 31 Aug 2020 22:29:04 +0800</pubDate><description><![CDATA[传送门
老师在开学第一天就把所有作业都布置了，每个作业如果在规定的时间内交上来的话才有学分。每个作业的截止日期和学分可能是不同的。例如如果一个作业学分为 10，要求在 6 天内交，那么要想拿到这 10 学分，就必须在第 6 天结束前交。
每个作业的完成时间都是只有一天。例如，假设有 7 次作业的学分和完成时间如下：

思路：参照网上的题解，采用贪心做法，将这些作业先安装学分从大到小进行排序，接着每次寻找距离截至日期最近有空闲的日子完成该作业并标记，这部分可以采用并查集完成。
#include&lt;bits]]></description><category></category></item><item><title><![CDATA[马拉车算法模板]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/108291803</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/108291803</guid><author>Charles6665</author><pubDate>Sat, 29 Aug 2020 11:08:26 +0800</pubDate><description><![CDATA[最近遇到几道回文字符串的题目都不太记得，来记录一下。
首先我们需要预处理字符串
例如abba,我们需要处理为：@#a#b#b#a#
    int init(string&amp; s)
    {
        str="@#";
        for(int i=0;i&lt;s.size();++i)
        {
            str+=s[i];
            str+='#';
        }
        return str.size();//返回处理后的]]></description><category></category></item><item><title><![CDATA[查找大小为M的最新分组]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/108286328</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/108286328</guid><author>Charles6665</author><pubDate>Fri, 28 Aug 2020 20:27:29 +0800</pubDate><description><![CDATA[解题思路：
参照大佬的题解，每次添加的时候一共有三种情况
1.左右都为空
2.左为空或者右为空
3.左右都不为空
接着跟新link数组即可
class Solution {
public:
    int maxz;

    int findLatestStep(vector&lt;int&gt;&amp; arr, int m) {
        maxz=arr.size();
        vector&lt;int&gt; g(maxz+3,1);
        int ans=-1;
 .]]></description><category></category></item><item><title><![CDATA[得到目标数组的最少函数调用次数]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/108188540</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/108188540</guid><author>Charles6665</author><pubDate>Sun, 23 Aug 2020 21:07:42 +0800</pubDate><description><![CDATA[把每个数看成二进制数，每位的1都是由操作1而得来的，故我们可以统计每位上1的数量来计算操作一的次数，操作二的次数为最大数所需要的右移次数
class Solution {
public:

    int minOperations(vector&lt;int&gt;&amp; nums) {
        int maxz=0;
        int ans=0;
        for(auto u:nums)
        {
            int h=0;
            .]]></description><category></category></item><item><title><![CDATA[2020-08-14]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/108014472</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/108014472</guid><author>Charles6665</author><pubDate>Fri, 14 Aug 2020 21:58:07 +0800</pubDate><description><![CDATA[传送门
来源：牛客网
qn是个特别可爱的小哥哥，qy是个特别好的小姐姐，他们两个是一对好朋友 [ cp (划掉~)
又是一年嘤花烂漫时，小qn于是就邀请了qy去嘤花盛开的地方去玩。当qy和qn来到了田野里时，qy惊奇的发现，嘤花花瓣以肉眼可见的速度从树上长了出来。
仔细看看的话，花瓣实际上是以一定规律长出来的，而且，每次张成新的花瓣的时候，上一次的花瓣就会都落到地上，而且不会消失。
花瓣生长的规律是，当次数大于等于2时，第i次长出来的花瓣个数和上一次张出来的花瓣个数的差是斐波那契数列的第i-1项。初始的时候]]></description><category></category></item><item><title><![CDATA[选择最佳路径]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/107870840</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/107870840</guid><author>Charles6665</author><pubDate>Fri, 07 Aug 2020 21:32:24 +0800</pubDate><description><![CDATA[有一天，琪琪想乘坐公交车去拜访她的一位朋友。
由于琪琪非常容易晕车，所以她想尽快到达朋友家。
现在给定你一张城市交通路线图，上面包含城市的公交站台以及公交线路的具体分布。
已知城市中共包含 n 个车站（编号1~n）以及 m 条公交线路。
每条公交线路都是 单向的，从一个车站出发直接到达另一个车站，两个车站之间可能存在多条公交线路。
琪琪的朋友住在 s 号车站附近。
琪琪可以在任何车站选择换乘其它公共汽车。
请找出琪琪到达她的朋友家（附近的公交车站）需要花费的最少时间。
输入格式
输入包含多组测试数据。
每组]]></description><category></category></item><item><title><![CDATA[毒瘤（位运算，贪心）]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/107834896</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/107834896</guid><author>Charles6665</author><pubDate>Thu, 06 Aug 2020 11:13:59 +0800</pubDate><description><![CDATA[传送门

思路：由异或的性质可以知道，要想异或后的值最大，那么每一位的异或后尽可能多的是1，所以我们可以提前预处理中l,r区间中第i位有多少个1，如果数量多与不是1的，那么答案这位就是0
#include&lt;bits/stdc++.h&gt;
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int sum[maxn][33];
int a[maxn];
int n,m;

int main()
{
	ios::sync_]]></description><category></category></item><item><title><![CDATA[购物（动态规划）]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/107834037</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/107834037</guid><author>Charles6665</author><pubDate>Thu, 06 Aug 2020 10:50:06 +0800</pubDate><description><![CDATA[传送门
在遥远的东方，有一家糖果专卖店。
这家糖果店将会在每天出售一些糖果，它每天都会生产出m个糖果，第i天的第j个糖果价格为C[i][j]元。
现在的你想要在接下来的n天去糖果店进行选购，你每天可以买多个糖果，也可以选择不买糖果，但是最多买m个。（因为最多只生产m个）买来糖果以后，你可以选择吃掉糖果或者留着之后再吃。糖果不会过期，你需要保证这n天中每天你都能吃到至少一个糖果。
这家店的老板看你经常去光顾这家店，感到非常生气。（因为他不能好好睡觉了）于是他会额外的要求你支付点钱。具体来说，你在某一天购买了 ]]></description><category></category></item><item><title><![CDATA[2020-08-06]]></title><link>https://blog.youkuaiyun.com/Charles6665/article/details/107833198</link><guid>https://blog.youkuaiyun.com/Charles6665/article/details/107833198</guid><author>Charles6665</author><pubDate>Thu, 06 Aug 2020 10:22:56 +0800</pubDate><description><![CDATA[传送门

思路：我们可以表示出红色部分的面积，可以发现当两个小圆半径相等的时候，红色部分面积最大，所以二分枚举验证即可，精度要求较大。
#include&lt;bits/stdc++.h&gt;
using namespace std;
double pi=acos(-1);
double cal(double x){
	return pi*x*x/4;
}
double s;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie]]></description><category></category></item></channel></rss>