<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hdu on I'm OWenT</title><link>//owent.net/tags/hdu.html</link><description>Recent content in Hdu on I'm OWenT</description><generator>Hugo</generator><language>zh-cn</language><copyright>&lt;a rel="license" href="https://github.com/owent/blog-hugo/blob/master/LICENSE.md"&gt;&lt;img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/80x15.png" /&gt;&lt;/a&gt;</copyright><lastBuildDate>Mon, 28 Apr 2014 21:10:46 +0000</lastBuildDate><atom:link href="//owent.net/tags/hdu/index.xml" rel="self" type="application/rss+xml"/><item><title>[ACM] HDU 1006 解题报告</title><link>//owent.net/2014/1046.html</link><pubDate>Mon, 28 Apr 2014 21:10:46 +0000</pubDate><guid>//owent.net/2014/1046.html</guid><description>&lt;p&gt;偶尔写写ACM水题还是挺好玩的。(好吧其实是老婆求助我才看滴)&lt;/p&gt;&#10;&lt;p&gt;题目链接：&lt;a href="http://acm.hdu.edu.cn/showproblem.php?pid=1006"&gt;http://acm.hdu.edu.cn/showproblem.php?pid=1006&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;一开始看到这题的时候，感觉一天24小时&lt;em&gt;60分钟&lt;/em&gt;60秒。把每一秒的最小指针角度记下来再搞个排序。&lt;/p&gt;&#10;&lt;p&gt;每个case二分搜一下就好啦。&lt;/p&gt;&#10;&lt;p&gt;结果发现最后一个case的结果始终是错的。&lt;/p&gt;</description></item><item><title>POJ 2192 Zipper HDU 2059 龟兔赛跑</title><link>//owent.net/2013/861.html</link><pubDate>Mon, 15 Jul 2013 18:39:41 +0000</pubDate><guid>//owent.net/2013/861.html</guid><description>&lt;p&gt;今天心情好，刷了两到ACM水题，思路很简单都在注释里，所以直接贴代码:&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-cpp"&gt;/**&#13;&#10; * @file 龟兔赛跑.cpp&#13;&#10; * @brief 龟兔赛跑 AC代码 (DP)&#13;&#10; * DP方程式: [到第i的充电站的最短时间] = [到最后一个冲了电的充电站的最短时间] &amp;#43; [那个充电站到第i个充电站的时间]&#13;&#10; *&#13;&#10; * @link http://acm.hdu.edu.cn/showproblem.php?pid=2059&#13;&#10; * @version 1.0&#13;&#10; * @author OWenT&#13;&#10; * @date 2013.07.15&#13;&#10; *&#13;&#10; * @history&#13;&#10; *&#13;&#10; *&#13;&#10; */&#13;&#10;&#13;&#10;#include &amp;lt;cstdio&amp;gt;&#13;&#10;#include &amp;lt;iostream&amp;gt;&#13;&#10;#include &amp;lt;cstring&amp;gt;&#13;&#10;#include &amp;lt;algorithm&amp;gt;&#13;&#10;#include &amp;lt;set&amp;gt;&#13;&#10;#include &amp;lt;numeric&amp;gt;&#13;&#10;&#13;&#10;int pn[128];&#13;&#10;double dp[128]; /** dp[i] 表示 到第i个充电站的最小时间(0为开始位置，n&amp;#43;1为终点) **/&#13;&#10;&#13;&#10;double calc_charge_time(int dis, int v1, int v2, int c) {&#13;&#10; if (dis &amp;lt;= c)&#13;&#10; return 1.0 * dis / v1;&#13;&#10;&#13;&#10; return 1.0 * c / v1 &amp;#43; 1.0 * (dis - c) / v2;&#13;&#10;}&#13;&#10;&#13;&#10;int main(int argc, char* argv[]) {&#13;&#10; using namespace std;&#13;&#10;&#13;&#10; double eps = std::numeric_limits&amp;lt;double&amp;gt;::epsilon();&#13;&#10; int l, n, c, t, vr, v1, v2;&#13;&#10;&#13;&#10; while(cin&amp;gt;&amp;gt; l) {&#13;&#10; cin &amp;gt;&amp;gt; n&amp;gt;&amp;gt; c&amp;gt;&amp;gt; t&amp;gt;&amp;gt; vr&amp;gt;&amp;gt; v1&amp;gt;&amp;gt; v2;&#13;&#10;&#13;&#10; pn[0] = 0; /** 0为起点 **/&#13;&#10; for (int i = 1; i &amp;lt;= n; &amp;#43;&amp;#43; i) {&#13;&#10; cin&amp;gt;&amp;gt; pn[i];&#13;&#10; }&#13;&#10; pn[n &amp;#43; 1] = l; /** n&amp;#43;1为终点 **/&#13;&#10;&#13;&#10; memset(dp, 0, sizeof(dp));&#13;&#10; for(int i = 0; i &amp;lt;= n &amp;#43; 1; &amp;#43;&amp;#43; i) {&#13;&#10; dp[i] = calc_charge_time(pn[i] - pn[0], v1, v2, c);&#13;&#10; }&#13;&#10;&#13;&#10; for(int i = 1; i &amp;lt;= n &amp;#43; 1; &amp;#43;&amp;#43; i) {&#13;&#10; for(int j = 0; j &amp;lt; i; &amp;#43;&amp;#43; j) {&#13;&#10; double tc = calc_charge_time(pn[i] - pn[j], v1, v2, c) &amp;#43; t &amp;#43; dp[j];&#13;&#10; dp[i] = std::min(tc, dp[i]);&#13;&#10; }&#13;&#10; &#13;&#10; }&#13;&#10;&#13;&#10; double rt = 1.0 * l / vr, tt = dp[n &amp;#43; 1];&#13;&#10;&#13;&#10; if (tt &amp;lt; rt)&#13;&#10; puts(&amp;#34;What a pity rabbit!&amp;#34;);&#13;&#10; else&#13;&#10; puts(&amp;#34;Good job,rabbit!&amp;#34;);&#13;&#10; }&#13;&#10;&#13;&#10; return 0;&#13;&#10;}&#13;&#10;&#13;&#10;/**&#13;&#10; * @file Zipper.cpp&#13;&#10; * @brief Zipper AC代码 (DP)&#13;&#10; * @link http://poj.org/problem?id=2192&#13;&#10; * DP方程式: [A串消耗个数i][B串消耗个数j] = min{[A串消耗个数i - 1][B串消耗个数j]|[A串消耗个数i][B串消耗个数j &amp;#43; 1]}&#13;&#10; * 以上分支选取条件是 A或B的新选用字符和C串新字符匹配&#13;&#10; *&#13;&#10; * @version 1.0&#13;&#10; * @author OWenT&#13;&#10; * @date 2013.07.15&#13;&#10; *&#13;&#10; * @history&#13;&#10; *&#13;&#10; *&#13;&#10; */&#13;&#10;&#13;&#10;#include &amp;lt;cstdio&amp;gt;&#13;&#10;#include &amp;lt;cstring&amp;gt;&#13;&#10;#include &amp;lt;algorithm&amp;gt;&#13;&#10;#include &amp;lt;set&amp;gt;&#13;&#10;#include &amp;lt;numeric&amp;gt;&#13;&#10;&#13;&#10;&#13;&#10;char strA[256], strB[256], strC[512];&#13;&#10;int dp[256][256]; /** dp[i][j] = k 表示A消耗了i个字符，B消耗了j个字符，拼成的C串消耗了k个字符（其实就是i&amp;#43;j） **/&#13;&#10;&#13;&#10;int main(int argc, char* argv[]) {&#13;&#10; using namespace std;&#13;&#10; int s, n;&#13;&#10;&#13;&#10; scanf(&amp;#34;%d&amp;#34;, &amp;amp;n);&#13;&#10; for( s = 0; s &amp;lt; n; &amp;#43;&amp;#43; s) {&#13;&#10; scanf(&amp;#34;%s %s %s&amp;#34;, strA, strB, strC);&#13;&#10; int lenA = strlen(strA);&#13;&#10; int lenB = strlen(strB);&#13;&#10; int lenC = strlen(strC);&#13;&#10; bool bFlag = false;&#13;&#10;&#13;&#10; if ( lenC != lenA &amp;#43; lenB ) {&#13;&#10; printf(&amp;#34;Data set %d: no\n&amp;#34;, s &amp;#43; 1);&#13;&#10; continue;&#13;&#10; }&#13;&#10;&#13;&#10; memset(dp, 0, sizeof(dp));&#13;&#10;&#13;&#10; if (strA[0] == strC[0])&#13;&#10; dp[1][0] = 1;&#13;&#10; if (strB[0] == strC[0])&#13;&#10; dp[0][1] = 1;&#13;&#10;&#13;&#10; for (int i = 0; i &amp;lt;= lenA; &amp;#43;&amp;#43; i) {&#13;&#10; for (int j = 0; j &amp;lt;= lenB; &amp;#43;&amp;#43; j) {&#13;&#10; if (0 == dp[i][j])&#13;&#10; continue;&#13;&#10;&#13;&#10; int ri = i &amp;#43; 1, rj = j &amp;#43; 1;&#13;&#10;&#13;&#10; if (strA[i] == strC[dp[i][j]]) {&#13;&#10; dp[ri][j] = dp[i][j] &amp;#43; 1;&#13;&#10; if (ri &amp;#43; j == lenC)&#13;&#10; bFlag = true;&#13;&#10; }&#13;&#10;&#13;&#10; if (strB[j] == strC[dp[i][j]]) {&#13;&#10; dp[i][rj] = dp[i][j] &amp;#43; 1;&#13;&#10; if (i &amp;#43; rj == lenC)&#13;&#10; bFlag = true;&#13;&#10; }&#13;&#10; }&#13;&#10; }&#13;&#10;&#13;&#10; printf(&amp;#34;Data set %d: %s\n&amp;#34;, s &amp;#43; 1, bFlag? &amp;#34;yes&amp;#34;: &amp;#34;no&amp;#34;);&#13;&#10; }&#13;&#10;&#13;&#10; return 0;&#13;&#10;}&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>HDU HDOJ 3398 String 解题报告</title><link>//owent.net/2010/31.html</link><pubDate>Wed, 05 May 2010 16:51:22 +0000</pubDate><guid>//owent.net/2010/31.html</guid><description>&lt;p&gt;题目链接：&lt;a href="http://acm.hdu.edu.cn/showproblem.php?pid=3398"&gt;http://acm.hdu.edu.cn/showproblem.php?pid=3398&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;题目要我们计算1，0的排列方式总数，并且对任意长的字符串，1的数量大于等于0的数量&lt;/p&gt;&#10;&lt;p&gt;我们可以把题目转化为从（0，0）点到（m，n）点的方法总数，且路径不经过y=x-1这条直线&lt;/p&gt;&#10;&lt;p&gt;然后我们可以把从（-1，-1）到（m，n）的所有路径按以y=x-1翻转，所得到的路径显然就是经过y=x-1的所有方案&lt;/p&gt;</description></item><item><title>HDU HDOJ 3400 Line belt 解题报告</title><link>//owent.net/2010/33.html</link><pubDate>Mon, 03 May 2010 11:17:15 +0000</pubDate><guid>//owent.net/2010/33.html</guid><description>&lt;p&gt;题目链接：&lt;a href="http://acm.hdu.edu.cn/showproblem.php?pid=3400"&gt;http://acm.hdu.edu.cn/showproblem.php?pid=3400&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;这题就是一道简单的两重三分&lt;/p&gt;&#10;&lt;p&gt;首先设e点为从ab上离开的点，f为从cd上进入的点&lt;/p&gt;&#10;&lt;p&gt;显然对固定点e,f从距c的距离的长度是一个单调函数或者先减后增的函数，这里可以三分算出最优解。这里是第一个三分&lt;/p&gt;&#10;&lt;p&gt;然后对e点的最优解易证也存在这个性质，所以再来一个三分，就能解除最优解&lt;/p&gt;</description></item><item><title>HDU 3336 Count the string 解题报告</title><link>//owent.net/2010/55.html</link><pubDate>Mon, 15 Mar 2010 11:12:56 +0000</pubDate><guid>//owent.net/2010/55.html</guid><description>&lt;p&gt;题目：&#10;&lt;a href="http://acm.hdu.edu.cn/showproblem.php?pid=3336"&gt;http://acm.hdu.edu.cn/showproblem.php?pid=3336&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;水题一道，主要是测试数据很水&lt;/p&gt;&#10;&lt;p&gt;不解释，贴代码：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-cpp"&gt;#include &amp;lt;iostream&amp;gt;&#13;&#10;#include &amp;lt;cstdio&amp;gt;&#13;&#10;#include &amp;lt;vector&amp;gt;&#13;&#10;#include &amp;lt;cstring&amp;gt;&#13;&#10;using namespace std;&#13;&#10;&#13;&#10;char str[200005];&#13;&#10;vector&amp;lt;long&amp;gt;glo_Pos;&#13;&#10;int main()&#13;&#10;{&#13;&#10; int t;&#13;&#10; long output,i,n,j;&#13;&#10; scanf(&amp;#34;%d&amp;#34;,&amp;amp;t);&#13;&#10; while(t --)&#13;&#10; {&#13;&#10; output = 0;&#13;&#10; glo_Pos.clear();&#13;&#10; scanf(&amp;#34;%ld %s&amp;#34;, &amp;amp;n, str);&#13;&#10;&#13;&#10; for(i = 0; i &amp;lt; n; i &amp;#43;&amp;#43;)&#13;&#10; {&#13;&#10; if(str[i] == str[0])&#13;&#10; {&#13;&#10; glo_Pos.push_back(i);&#13;&#10; output &amp;#43;&amp;#43;;&#13;&#10; }&#13;&#10; }&#13;&#10; output = output % 10007;&#13;&#10; for(i = 1; i &amp;lt; n; i &amp;#43;&amp;#43;)&#13;&#10; {&#13;&#10; for(j = 0; j &amp;lt; glo_Pos.size();j &amp;#43;&amp;#43;)&#13;&#10; {&#13;&#10; if(str[i] == str[glo_Pos[j] &amp;#43; i])&#13;&#10; output = (output &amp;#43; 1) % 10007;&#13;&#10; else&#13;&#10; {&#13;&#10; glo_Pos.erase(glo_Pos.begin() &amp;#43; j);&#13;&#10; j --;&#13;&#10; }&#13;&#10; }&#13;&#10; }&#13;&#10;&#13;&#10; printf(&amp;#34;%ld\n&amp;#34;, output);&#13;&#10; }&#13;&#10; return 0;&#13;&#10;}&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>