<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Konse的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Konse</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Konse]]></copyright><item><title><![CDATA[【题解】P1880 [NOI1995] 石子合并]]></title><link>https://blog.youkuaiyun.com/Konse/article/details/119057719</link><guid>https://blog.youkuaiyun.com/Konse/article/details/119057719</guid><author>Konse</author><pubDate>Sat, 24 Jul 2021 14:13:40 +0800</pubDate><description><![CDATA[居然是个环= =…
思路
区间dp，要看怎么合并最小和最大，我们自然就想到枚举所有可能的区间！难点就是状态转移方程啦（☞完全不会）。
状态转移方程： dp[i][j] = dp[i][k] + dp[k + 1][j] + sum[i][j] （i &lt;= k &lt; j）
dp[i][j] -&gt; i 到 j 的区间合并，sum[i][j] -&gt; i 到 j 堆的值的和
直接举例,按照样例4 5 9 4这样的四颗石子来！
刚开始的时候每个dp区间都是自己到自己，初始化为 0dp[i][i]]]></description><category></category></item><item><title><![CDATA[【题解】 P1280 尼克的任务]]></title><link>https://blog.youkuaiyun.com/Konse/article/details/119034153</link><guid>https://blog.youkuaiyun.com/Konse/article/details/119034153</guid><author>Konse</author><pubDate>Fri, 23 Jul 2021 14:37:33 +0800</pubDate><description><![CDATA[搞清楚了就很简单的dp题！
思路
设dp[i]表示i ~ n的最大空闲时间
状态转移方程：
（空闲) dp[i] = dp[i + 1] + 1;
（有工作）dp[i] = max(dp[i], dp[i + s[num++].time);
（在 i 时刻的开始工作的此工作需要持续的时间为 s[num++].time）
所以我们需要一个结构体来存储开始的时间和工作持续的时间
struct Node
{
  int begin, time;
}s[N];

因为后面的开始时间会影响前面的休息时间，有多种可能的]]></description><category></category></item><item><title><![CDATA[【题解】P1010 [NOIP1998 普及组] 幂次方]]></title><link>https://blog.youkuaiyun.com/Konse/article/details/118891035</link><guid>https://blog.youkuaiyun.com/Konse/article/details/118891035</guid><author>Konse</author><pubDate>Mon, 19 Jul 2021 10:54:18 +0800</pubDate><description><![CDATA[直接打表，不用动脑(打 表 次 方)！
思路
反正数据最大2e4也就是说超不过2^15。那么我们直接打表，从0~14都手写出来，然后把输入的数分解了之后就可以直接输出啦！
打表
	out[0] = "2(0)";
	out[1] = "2";
	out[2] = "2(2)";
	out[3] = "2(2+2(0))";
	out[4] = "2(2(2))";
	out[5] = "2(2(2)+2(0))";
	out[6] = "2(2(2)+2)";
	out[7] = "2(2(2)+2+2(0]]></description><category></category></item><item><title><![CDATA[【题解】P4387 【深基15.习9】验证栈序列]]></title><link>https://blog.youkuaiyun.com/Konse/article/details/118862693</link><guid>https://blog.youkuaiyun.com/Konse/article/details/118862693</guid><author>Konse</author><pubDate>Sat, 17 Jul 2021 21:10:39 +0800</pubDate><description><![CDATA[直接用栈来模拟！
思路
既然我们是要验证栈的序列，那么我们直接来模拟实现那个要进行输出的序列情况，如果无法模拟出来，那么就不是栈的序列！
1 2 3 4 5
5 4 3 2 1
由这个样例我们可以看出，是入栈到到了最后的 5 才依次出栈形成的栈序列。
1 2 3 4 5
2 1 5 4 3
由这个例子可以看出，是先入栈到了 2 以后进行了出栈两次，把 2 和 1 出栈了以后再进行3 4 5的入栈而后再进行依次出栈 5 4 3。
对比上面两种情况我们可以发现，只要第一行的入栈序列值，等于第二行队头的出栈序列值]]></description><category></category></item><item><title><![CDATA[【题解】P1731 [NOI1999] 生日蛋糕]]></title><link>https://blog.youkuaiyun.com/Konse/article/details/118862688</link><guid>https://blog.youkuaiyun.com/Konse/article/details/118862688</guid><author>Konse</author><pubDate>Sat, 17 Jul 2021 21:10:06 +0800</pubDate><description><![CDATA[非常麻烦的剪枝条件！
思路
表面积S = 2πr^ h; 体积V = πr^2  h;根据题意可以在计算时约去π。由于蛋糕的高度和半径都是需要逐层递减的，所以最大高度和最大的半径都一定是小于n的，我们通过dfs暴力搜索，枚举每一层可能的高度h和半径r，直到找到层数和体积都符合题意，而且使得表面积最小的答案。
有几个要进行剪枝的地方：
1. 已经用的表面积比当前最优答案大或者是此时体积体积超出题目要求的范围
2.当前的表面积 + 用去侧面积 &gt;= 当前答案值（关键剪枝）
然后就可以解出结果啦！直接放全部]]></description><category></category></item><item><title><![CDATA[【题解】P1449 后缀表达式]]></title><link>https://blog.youkuaiyun.com/Konse/article/details/118862681</link><guid>https://blog.youkuaiyun.com/Konse/article/details/118862681</guid><author>Konse</author><pubDate>Sat, 17 Jul 2021 21:09:35 +0800</pubDate><description><![CDATA[输入反而是最麻烦的）
思路
跟那道P1981表达式求值挺像的，这题就是把在里面的加减乘除放到了要算的数字后面，就拿例子来说：
3.5.2.-*7.+@
在这部分 3.5.2.-* 中我们可以看到3*(5–2)这个部分肯定是先算 - 号的，也就是说我们的运算顺序是按照在数字背后的运算符的顺序进行运算，先算的是 (5–2)，也就是前面数字的最后两个进行减法运算，这就符合栈的规则，先进后出，值得注意的一点是要看清减数和被减数，是第二个出栈的减去第一个出栈的，除号也是如此，加号和乘号的话由于没有区别所以可以不用在意]]></description><category></category></item><item><title><![CDATA[【题解】P1433 吃奶酪]]></title><link>https://blog.youkuaiyun.com/Konse/article/details/118862646</link><guid>https://blog.youkuaiyun.com/Konse/article/details/118862646</guid><author>Konse</author><pubDate>Sat, 17 Jul 2021 21:07:31 +0800</pubDate><description><![CDATA[玄学搜索，随缘AC
思路
非常明了，题目要求算坐标间的最短距离，保留两位小数，我们就先初始化所有点之间的距离，用一个数组存起来
for(int i = 0; i &lt;= n; i++)
    {
        for(int j = 0;j &lt;= n; j++)
        {
            //初始化每点间的距离 
            s[i][j] = sqrt((a[j] - a[i]) * (a[j] - a[i]) + (b[j] - b[i]) * (b[j] -]]></description><category></category></item><item><title><![CDATA[【题解】 P1162 填涂颜色]]></title><link>https://blog.youkuaiyun.com/Konse/article/details/118862624</link><guid>https://blog.youkuaiyun.com/Konse/article/details/118862624</guid><author>Konse</author><pubDate>Sat, 17 Jul 2021 21:06:23 +0800</pubDate><description><![CDATA[完全是因为数据太少而混了AC的方法
本来以为要用搜索，结果这题好水!这就来写一个直接扫描一遍的做法！
思路
实际上，如果是在圈内，从左到右，从上到下扫描的话，圈内的点{x, y}的左边和上面一定是大于0的。比如下面这个例子。
6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
我们可以看到删除线中的0就是我们扫到的第一个符合条件的结果。将其更新为2，更新为2之后，它的下一个元素的左边就是2，上面就是1。
这样的话]]></description><category></category></item><item><title><![CDATA[【题解】P1198 [JSOI2008]最大数]]></title><link>https://blog.youkuaiyun.com/Konse/article/details/118862587</link><guid>https://blog.youkuaiyun.com/Konse/article/details/118862587</guid><author>Konse</author><pubDate>Sat, 17 Jul 2021 21:04:56 +0800</pubDate><description><![CDATA[单调队列一步到位）
思路
首先一看！有个查询操作，还有个添加操作，要找倒数L位的最大值。再一看操作的个数M &lt;= 2e5，那么每次都查询都对后面L位找最大显然就不现实了。（优先队列破产）
虽然觉得不现实，但是还是用了（因为能混点分嘛）。

#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;queue&gt;
using namespace std;
int m, d;

int main()
{
	vector&lt;int&]]></description><category></category></item></channel></rss>