<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>難易度-1800 - IQパズルステップ</title>
	<atom:link href="https://chokomon.com/tag/difficulty-1800/feed/" rel="self" type="application/rss+xml" />
	<link>https://chokomon.com</link>
	<description>ちょこっと頭を良くするIQパズル問題集</description>
	<lastBuildDate>Wed, 19 Oct 2022 12:49:52 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://chokomon.com/wp-content/uploads/2022/02/cropped-icon512-32x32.png</url>
	<title>難易度-1800 - IQパズルステップ</title>
	<link>https://chokomon.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【クラス・構造体メニュー】静的メンバ (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/26-class_primer-02-06-00673/</link>
					<comments>https://chokomon.com/26-class_primer-02-06-00673/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Wed, 19 Oct 2022 12:49:50 +0000</pubDate>
				<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[クラス・構造体メニュー]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1800]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=7031</guid>

					<description><![CDATA[【クラス・構造体メニュー】> FINAL問題【静的メンバ】静的メンバ (paizaランク B 相当) [難易度: 1813 ±19] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/26-class_primer/">クラス・構造体メニュー</a>】> <a rel="noreferrer noopener" href="https://paiza.jp/works/mondai/class_primer/class_primer__static_member" target="_blank">FINAL問題【静的メンバ】静的メンバ (paizaランク B 相当)</a> [難易度: <strong>1813 ±19</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img fetchpriority="high" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/10/26-02-06-01.png" alt="" class="wp-image-7033"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>居酒屋で働きながらクラスの勉強をしていたあなたは、お客さんをクラスに見立てることで勤務時間中の店内の人数や注文の情報を管理できることに気付きました。<br>全てのお客さんは、ソフトドリンクと食事を頼むことができます。加えて 20 歳以上のお客さんはお酒を頼むことができます。<br>20 歳未満のお客さんがお酒を頼もうとした場合はその注文は取り消されます。<br>また、お酒（ビールを含む）を頼んだ場合、以降の全ての食事の注文 が毎回 200 円引きになります。</p>



<p>今回、この居酒屋でビールフェスをやることになり、ビールの注文が相次いだため、いちいちビールの値段である 500 円を書くのをやめ、注文の種類と値段を書く代わりに 0 とだけを書くことになりました。</p>



<p>勤務時間の初めに店内にいるお客さんの人数と与えられる入力の回数、各注文をしたお客さんの番号とその内容、または退店したお客さんの番号が与えられます。<br>お客さんが退店する場合はそのお客さんの会計を出力してください。勤務時間中に退店した全てのお客さんの会計を出力したのち、勤務時間中に退店した客の人数を出力してください。</p>



<p></p>



<p><strong>入力値（例）</strong><br>2 3<br>20<br>30<br>1 0<br>2 0<br>1 A</p>



<p><strong>出力値（例）</strong><br>500<br>1</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    class Customer {
        public $payment = 0;
        private static $counter = 0;
        
        public function __construct($payment) {
            $this-&gt;payment = $payment = 0;
        }
        
        public static function GetNumberOfVisitors() {
            return Customer::$counter;
        }
    
        public function GetPayment() {
            Customer::$counter++;
            return $this-&gt;payment;
        }
    
        public function OrderFood($price) {
            $this-&gt;payment += $price;
        }
    
        public function OrderSoftDrink($price) {
            $this-&gt;payment += $price;
        }
    
        public function OrderAlcohol($price = 500) {
            // echo "お酒は20歳になってから";
        }
    }
    
    class AdultCustomer extends Customer {
        public $discount;
        
        public function __construct($discount) {
            $this-&gt;discount = $discount = false;
        }
    
        public function OrderFood($price) {
            $this-&gt;payment += $this-&gt;discount ? $price - 200 : $price;
        }
    
        public function OrderAlcohol($price = 500) {
            $this-&gt;payment += $price;
            if (!$this-&gt;discount) {
                $this-&gt;discount = true;
            }
        }
    }
    
    list($n, $k) = explode(" ", trim(fgets(STDIN)));
    for($i=0; $i&lt;$n; $i++) {
        $age = trim(fgets(STDIN));
        
        if($age&lt;20) {
            $customers[] = new Customer($age);
        } else {
            $customers[] = new AdultCustomer($age);
        }
    }
    
    for($i=0; $i&lt;$k; $i++) {
        $input = explode(" ", trim(fgets(STDIN)));
        
        $index = $input[0];
        $index--;
        
        $order = $input[1];
        
        if($order == "A") {
            echo $customers[$index]-&gt;GetPayment(). "\n";
        } elseif($order == 0) {
            $order = "beer";
        } else {
            $price = $input[2];
        }
        
        switch($order) {
            case "food":
                $customers[$index]-&gt;OrderFood($price);
                break;
            case "softdrink":
                $customers[$index]-&gt;OrderSoftDrink($price);
                break;
            case "alcohol":
                $customers[$index]-&gt;OrderAlcohol($price);
                break;
            case "beer":
                $customers[$index]-&gt;OrderAlcohol();
                break;
        }
    }
    //print_r($customers);
    
    echo Customer::GetNumberOfVisitors(). "\n";
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="660" height="200" src="https://chokomon.com/wp-content/uploads/2022/10/26-02-06-02.png" alt="" class="wp-image-7034"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/26-class_primer-02-06-00673/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【paizaの森練習問題コンテスト6】最大イニング (paizaランク D)-解答例-PHP編</title>
		<link>https://chokomon.com/42-forest_contest-06-02-00667/</link>
					<comments>https://chokomon.com/42-forest_contest-06-02-00667/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Wed, 12 Oct 2022 08:23:10 +0000</pubDate>
				<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[練習問題コンテスト]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクD]]></category>
		<category><![CDATA[難易度-1800]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6997</guid>

					<description><![CDATA[【paizaの森練習問題コンテスト6】過去問題6 > 最大イニング (paizaランク D 相当) [難易度: 1850 ±50] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/paiza_set/42-forest_contest/">paizaの森練習問題コンテスト6</a>】<a href="https://paiza.jp/works/mondai/forest_contest_006/forest_contest_006__d_maxinning" target="_blank" rel="noreferrer noopener">過去問題6 > 最大イニング (paizaランク D 相当)</a> [難易度: <strong>1850 ±50</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/10/42-06-02-01.png" alt="" class="wp-image-6998"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>プロ野球歴 6 年目の小柳くんは投手として完投する（1 試合を 1 人で投げ切る）ことにこだわりを持っているため、決して自らマウンドを降りません。小柳くんはある試合で 9 イニングを投げきり、i (1 ≦ i ≦ 9) イニング目に投げた球数は m_i 球でした。しかし監督であるあなたは選手の体の状態を考慮しないといけないため、<code>k</code>球に到達した段階で小柳くんを降板させる必要がありました。小柳くんは球数を考慮した上でも完投できたのかどうか、完投出来ない場合は何イニング目で降板させるべきだったのかを答えてください。</p>



<p>なお、代打や代走などによる攻撃中の投手交代はないものとします。<br>また、この試合に延長やコールドはなく、９イニングで終了します。<br>自チームは後攻で、相手チームの攻撃は試合展開にかかわらず、９イニングおこなわれます。</p>



<p>ちょうどイニングの終了時に k 球に到達した場合は、もうそのイニングが終了してしまい、投手を交代することができないため、次のイニング開始時に降板します。(入力例 3 のケース)</p>



<p></p>



<p><strong>入力値（例）</strong><br>99<br>6<br>16<br>14<br>22<br>8<br>11<br>7<br>10<br>4</p>



<p><strong>出力値（例）</strong><br>Yes</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    $k = trim(fgets(STDIN));
    
    $total = 0;
    $flag = false;
    
    for($i=0; $i&lt;9; $i++) {
        $m = trim(fgets(STDIN));
        $total += $m;
        if($total &gt; $k) {
            $flag = true;
            $counter = $i+1;
            break;
        }
    }
    echo ($flag) ? $counter : "Yes";
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="160" src="https://chokomon.com/wp-content/uploads/2022/10/42-06-02-02.png" alt="" class="wp-image-6999"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/42-forest_contest-06-02-00667/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【クエリメニュー】点の幅 (paizaランク A)-解答例-PHP編</title>
		<link>https://chokomon.com/17-query_primer-04-03-00625/</link>
					<comments>https://chokomon.com/17-query_primer-04-03-00625/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Sat, 10 Sep 2022 02:59:30 +0000</pubDate>
				<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[クエリメニュー]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクA]]></category>
		<category><![CDATA[難易度-1800]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6740</guid>

					<description><![CDATA[【クエリメニュー】> FINAL問題 点の幅 (paizaランク A 相当) [難易度: 1878 ±36] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/17-query_primer/">クエリメニュー</a>】> <a href="https://paiza.jp/works/mondai/query_primer/query_primer__range_of_score" target="_blank" rel="noreferrer noopener">FINAL問題 点の幅 (paizaランク A 相当)</a> [難易度: <strong>1878 ±36</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/09/17-04-03-01.png" alt="" class="wp-image-6741"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>テストの返却中に暇だった paiza 君は、また 2 人で遊ぶゲームを思いつきました。</p>



<p>「2 人はそれぞれ生徒番号 1 〜 N の全校生徒 N 人の中から生徒番号が連続するように好きな人数の生徒を選ぶ。その選んだ生徒達の得点の幅が大きい方、すなわちその生徒たちの (最高点 - 最低点) の値が大きい方が勝ち、同じだったら引き分け！」</p>



<p>「ただし、このルールだと人を多く選ぶ方が有利になってしまうから、選べる生徒の数はお互い N/2 人以下ね！」</p>



<p>また審判を任されたあなたは、全ての生徒の得点を記録しておくことで、選んだ生徒たちの最小・最大の生徒番号を確認するだけで、その生徒たちの中の (最高点 - 最低点) の値をすぐに求めることができることに気付きました。</p>



<p>学校の生徒数 N と試合の数 K , 各生徒の得点 S_1 ... S_N と、<br>i 番目の試合で対戦した A と B の 2 人が選んだ生徒の最小の生徒番号と最大の生徒番号が与えられるので、各試合のジャッジをしてください。</p>



<p></p>



<p><strong>入力値（例）</strong><br>4 2<br>1<br>3<br>2<br>4<br>1 2 2 3<br>1 2 3 4</p>



<p><strong>出力値（例）</strong><br>A<br>DRAW</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    list($n, $k) = explode(" ", trim(fgets(STDIN)));
    
    for ($i=1; $i&lt;$n; $i++) {
        if ($i * $i == $n) {
            $root = $i;
            break;
        }
    }

    for ($i=0; $i&lt;$n; $i++) {
        $s[$i] = trim(fgets(STDIN));
    }

    for ($i=0; $i&lt;$root; $i++) {
        for ($j=0; $j&lt;$root; $j++) {
            if ($j == 0) {
                $range_max[$i] = $s[$i*$root];
                $range_min[$i] = $s[$i*$root];
            } else {
                $range_max[$i] = max($range_max[$i], $s[$i*$root+$j]);
                $range_min[$i] = min($range_min[$i], $s[$i*$root+$j]);
            }
        }
    }
    
    for ($i=0; $i&lt;$k; $i++) {
        list($al, $ar, $bl, $br) = explode(" ", trim(fgets(STDIN)));
        $al--;
        $ar--;
        $amx = $s[$al];
        $amn = $s[$al];
        $anow = $al;

        while ($anow &lt;= $ar) {
            if ($anow%$root == 0 &amp;&amp; $anow+$root-1 &lt;= $ar) {
                $amx = max($amx, $range_max[$anow/$root]);
                $amn = min($amn, $range_min[$anow/$root]);
                $anow += $root;
            } else {
                $amx = max($amx, $s[$anow]);
                $amn = min($amn, $s[$anow]);
                $anow++;
            }
        }

        $bl--;
        $br--;
        $bmx = $s[$bl];
        $bmn = $s[$bl];
        $bnow = $bl;

        while ($bnow &lt;= $br) {
            if ($bnow%$root == 0 &amp;&amp; $bnow+$root-1 &lt;= $br) {
                $bmx = max($bmx, $range_max[$bnow/$root]);
                $bmn = min($bmn, $range_min[$bnow/$root]);
                $bnow += $root;
            } else {
                $bmx = max($bmx, $s[$bnow]);
                $bmn = min($bmn, $s[$bnow]);
                $bnow++;
            }
        }

        if ($amx-$amn == $bmx-$bmn) {
            $result = "DRAW";
        } elseif ($amx-$amn &gt; $bmx-$bmn) {
            $result = "A";
        } else {
            $result = "B";
        }
    
        echo $result. "\n";
    }
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="200" src="https://chokomon.com/wp-content/uploads/2022/09/17-04-03-02.png" alt="" class="wp-image-6742"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/17-query_primer-04-03-00625/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【クエリメニュー】二次元累積和 (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/17-query_primer-03-03-00604/</link>
					<comments>https://chokomon.com/17-query_primer-03-03-00604/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Tue, 30 Aug 2022 19:58:09 +0000</pubDate>
				<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[クエリメニュー]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1800]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6599</guid>

					<description><![CDATA[【クエリメニュー】&#62; 【平方分割】STEP: 3 二次元累積和 (paizaランク B 相当)&#160;[難易度:&#160;1825&#160;±29] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a rel="noreferrer noopener" href="https://chokomon.com/paiza_mondai/17-query_primer/" target="_blank">クエリメニュー</a>】&gt; <a href="https://paiza.jp/works/mondai/query_primer/query_primer__two_dimensions_cumulative__sum" target="_blank" rel="noreferrer noopener">【平方分割】STEP: 3 二次元累積和 (paizaランク B 相当)</a>&nbsp;[難易度:&nbsp;<strong>1825&nbsp;±29</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/17-03-03-01.png" alt="" class="wp-image-6600"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>H 行 W 列 の行列 A の y 行 x 列における累積和 S(y,x) を以下の数式・図の通り定義します。以後 A の y 行 x 列の要素を A[y][x] と表すことにします。</p>



<p>S(y,x) = A[1][1] + A[1][2] + ... + A[1][x] + A[2][1] + ... + A[2][x] + ... + A[y][1] + ... + A[y][x]



<p>H 行 W 列 の二次元配列 A と、累積和を求めたい行・列番号についての情報が与えられるので、各ペアについて累積和を求めてください。<br>例として、入力例 1 の行列における累積和 S(2,2) は次のピンクの部分の和となり、<code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-light-orange-color">S(2,2) = 12</mark></code>&nbsp;となります。</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" src="https://chokomon.com/wp-content/uploads/2022/08/5.jpeg" alt="" class="wp-image-6601" width="512" height="384" srcset="https://chokomon.com/wp-content/uploads/2022/08/5.jpeg 1024w, https://chokomon.com/wp-content/uploads/2022/08/5-768x576.jpeg 768w" sizes="auto, (max-width: 512px) 100vw, 512px" /></figure>



<p></p>



<p><strong>入力値（例）</strong><br>3 3 3<br>1 2 3<br>4 5 6<br>7 8 9<br>1 1<br>2 2<br>3 3</p>



<p><strong>出力値（例）</strong><br>1<br>12<br>45</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    list($h, $w, $n) = explode(" ", trim(fgets(STDIN)));
    
    $sRow = array_fill(0, $h+1, 0);
    $s = array_fill(0, $w+1, $sRow);
    
    for ($i=0; $i&lt;$h; $i++) {
        $a[$i] = explode(" ", trim(fgets(STDIN)));
        
        for ($j=0; $j&lt;$w; $j++) {
            $s[$i+1][$j+1] = $a[$i][$j]+$s[$i][$j+1]+$s[$i+1][$j]-$s[$i][$j];
        }
    }
    //print_r($s);
    
    for ($i=0; $i&lt;$n; $i++) {
        list($y, $x) = explode(" ", trim(fgets(STDIN)));
        printf("%d\n", $s[$y][$x]);
    }
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="200" src="https://chokomon.com/wp-content/uploads/2022/08/17-03-03-02.png" alt="" class="wp-image-6602"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/17-query_primer-03-03-00604/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【クエリメニュー】経理 (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/17-query_primer-02-04-00599/</link>
					<comments>https://chokomon.com/17-query_primer-02-04-00599/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Sat, 27 Aug 2022 10:48:08 +0000</pubDate>
				<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[クエリメニュー]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1800]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6574</guid>

					<description><![CDATA[【クエリメニュー】> 【Vtuber】STEP: 4 経理 (paizaランク B 相当) [難易度: 1890 ±27] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/17-query_primer/">クエリメニュー</a>】> <a href="https://paiza.jp/works/mondai/query_primer/query_primer__accounting" target="_blank" rel="noreferrer noopener">【Vtuber】STEP: 4 経理 (paizaランク B 相当)</a> [難易度: <strong>1890 ±27</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/17-02-04-01.png" alt="" class="wp-image-6575"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>paiza には N 個の部署があり、名前はそれぞれ S_1 ... S_N です。<br>経理係となったあなたは、どの部署が何円のどのような買い物をしたかを記録するように言われました。<br>どの部署が何円で何を買ったかの領収書が K 枚与えられるので、各部署の会計表を作成しましょう。</p>



<p></p>



<p><strong>入力値（例）</strong><br>3 6<br>A<br>B<br>C<br>A 1 100<br>B 2 100<br>A 3 500<br>C 4 895<br>C 5 890<br>A 6 2685</p>



<p><strong>出力値（例）</strong><br>A<br>1 100<br>3 500<br>6 2685<br>-----<br>B<br>2 100<br>-----<br>C<br>4 895<br>5 890<br>-----</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    list($n, $k) = explode(" ", trim(fgets(STDIN)));

    $receipt = array(""=&gt;Array());

    for ($i = 0; $i &lt; $n; $i++) {
        $s[$i] = trim(fgets(STDIN));
        $receipt += array($s[$i]=&gt;Array());
    }
    
    for ($i = 0; $i &lt; $k; $i++) {
        list($a, $p, $m) = explode(" ", trim(fgets(STDIN)));
        array_push($receipt[$a],Array("number" =&gt; $p,  "price" =&gt; $m));
    }
    //print_r ($receipt);

    unset($receipt['']);

    for ($i = 0; $i &lt; $n; $i++) {

        echo $s[$i]. "\n";
        
        foreach($receipt[$s[$i]] as $array =&gt; $data) {
            echo $data["number"]." ".$data["price"]."\n";
        }
        echo "-----". "\n";
    }
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="420" src="https://chokomon.com/wp-content/uploads/2022/08/17-02-04-02.png" alt="" class="wp-image-6576"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/17-query_primer-02-04-00599/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【クエリメニュー】アイドルグループ (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/17-query_primer-02-01-00595/</link>
					<comments>https://chokomon.com/17-query_primer-02-01-00595/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Tue, 23 Aug 2022 22:45:16 +0000</pubDate>
				<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[クエリメニュー]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1800]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6546</guid>

					<description><![CDATA[【クエリメニュー】> 【Vtuber】STEP: 1 アイドルグループ (paizaランク B 相当) [難易度: 1858 ±24] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/17-query_primer/">クエリメニュー</a>】> <a href="https://paiza.jp/works/mondai/query_primer/query_primer__idle_group" target="_blank" rel="noreferrer noopener">【Vtuber】STEP: 1 アイドルグループ (paizaランク B 相当)</a> [難易度: <strong>1858 ±24</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/17-02-01-01.png" alt="" class="wp-image-6547"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>N 人組のロボットアイドルグループのマネージャーとなった paiza 君は、グループに所属しているアイドル全員の名前を把握しておく必要があります。アイドルグループにはメンバーの加入と脱退がつきものなので、そのたびにメンバーを覚えたり忘れたりする必要があります。<br>paiza 君は仕事として握手会の度にアイドル全員の名前を書き出します。<br>ロボットの名前はほとんどが乱数的に付けられたものなので覚えるのが大変です。<br>そこで、イベント（メンバーの加入・脱退と握手会）が与えられるので、それらに伴う paiza 君の仕事をおこなうプログラムを作成しましょう。</p>



<p></p>



<p><strong>条件</strong><br>・1 ≦ N , K ≦ 100,000<br>・name_i はアルファベット小文字(a ~ z)と数字(0 ~ 9)から成る 20 文字以下の文字列です。 (1 ≦ i ≦ N)<br>・S_i (1 ≦ i ≦ K) は次のいずれかの形式で与えられます。</p>



<p>・<code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-light-orange-color">join name</mark></code><br>name という名前のアイドルが加入することを表します。<br>name はアルファベット小文字(a ~ z)と数字(0 ~ 9)から成る 20 文字以下の文字列です。</p>



<p>・<code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-light-orange-color">leave name</mark></code><br>name という名前のアイドルが脱退することを表します。<br>name はアルファベット小文字(a ~ z)と数字(0 ~ 9)から成る 20 文字以下の文字列です。<br>脱退時に name という名前のアイドルがグループにいることが保証されています。</p>



<p>・<code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-light-orange-color">handshake</mark></code><br>握手会がおこなわれることを表します。<br>握手会時点でのグループの全メンバーの名前を辞書順に改行区切りで出力してください。<br>グループのメンバーが 0 人であるときには何も出力しないでください。</p>



<p>・アイドルグループに所属するメンバーの名前は重複しないことが保証されています。<br>・握手会がおこなわれるのは 10 回以下であることが保証されています。</p>



<p></p>



<p><strong>入力値（例）</strong><br>2 7<br>nene<br>ao<br>handshake<br>leave nene<br>join neko<br>join koko<br>handshake<br>leave neko<br>handshake</p>



<p><strong>出力値（例）</strong><br>ao<br>nene<br>ao<br>koko<br>neko<br>ao<br>koko</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    list($n, $k) = explode(" ", trim(fgets(STDIN)));
    
    for ($i = 0; $i &lt; $n; $i++) {
        $a[] = trim(fgets(STDIN));    
    }
    
    for ($i = 0; $i &lt; $k; $i++) {
        $s = trim(fgets(STDIN));
        
        if ($s == "handshake") {
            sort($a);
            foreach ($a as $value) {
                echo $value. "\n";
            }
            
        } else {
            list($event, $name) = explode(" ", $s);
            
            if ($event == "join") {
                $a[] = $name;
                
            } else {
                $num = array_search($name, $a);
                unset($a[$num]);
            }
        }
    }
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="320" src="https://chokomon.com/wp-content/uploads/2022/08/17-02-01-02.png" alt="" class="wp-image-6548"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/17-query_primer-02-01-00595/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【日付セット】曜日(large) (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/34-dateset-01-07-00584/</link>
					<comments>https://chokomon.com/34-dateset-01-07-00584/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Thu, 18 Aug 2022 17:50:25 +0000</pubDate>
				<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[日付セット]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1800]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6461</guid>

					<description><![CDATA[【日付セット】&#62; 曜日(large) (paizaランク B 相当)&#160;[難易度:&#160;1850&#160;±26] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例 別解 YouTubeの問題…]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/paiza_set/34-dateset/">日付セット</a>】&gt; <a href="https://paiza.jp/works/mondai/dateset/day_of_week_large" target="_blank" rel="noreferrer noopener">曜日(large) (paizaランク B 相当)</a>&nbsp;[難易度:&nbsp;<strong>1850&nbsp;±26</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/34-01-07-01.png" alt="" class="wp-image-6462"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>西暦y年m月d日が何曜日か表示してください。</p>



<p>ただし、各月の日数は以下のように決まることに注意してください。<br>・4, 6, 9, 11月は30日<br>・2月は閏年ならば29日、そうでなければ28日<br>・それ以外の月は31日</p>



<p>ただし、閏年は次のような年のことをいいます。<br>・西暦が4で割り切れる年は閏年<br>・ただし、100で割り切れる年は平年<br>・ただし、400で割り切れる年は閏年</p>



<p>ただし、1800年1月1日は水曜日です。</p>



<p>参考:&nbsp;<a href="https://ja.wikipedia.org/wiki/%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F#%E3%83%95%E3%82%A7%E3%82%A2%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E5%85%AC%E5%BC%8F" target="_blank" rel="noreferrer noopener">ツェラーの公式#フェアフィールドの公式</a></p>



<p></p>



<p><strong>入力値（例）</strong><br>2019 4 9<br><br><strong>出力値（例）</strong><br>火曜日</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    list($y, $m, $d) = explode(" ", trim(fgets(STDIN)));
    
    $Zeller = function($y, $m, $d, $flg = false) {
        if($m &lt;= 2) {
            $m += 12;
            $y -= 1;
        }
        
    $wd = array("日", "月", "火", "水", "木", "金", "土");
    
    $g = ($y+(int)($y/4)-(int)($y/100)+(int)($y/400)+(int)(((13 * $m) +8)/5)+$d)%7;
        return $flg ? sprintf("%s曜日\n", $wd[$g]) : $g;
    };
    
    printf($Zeller($y, $m, $d, true));
 ?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="160" src="https://chokomon.com/wp-content/uploads/2022/08/34-01-07-02.png" alt="" class="wp-image-6463"/></figure>



<h2 class="wp-block-heading">別解</h2>



<p>YouTubeの問題解説動画(<a rel="noreferrer noopener" href="https://www.youtube.com/watch?v=492L9rE95uo" target="_blank">https://www.youtube.com/watch?v=492L9rE95uo</a>）からPHPに書き起こしました。PHPだとlong型が使えないので、タイムオーバー回避を使っています。</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    list($year, $month, $day) = explode(" ", trim(fgets(STDIN)));
    
    $year = $year % 400 + 2000; //タイムオーバー回避用：400年おきだと曜日は変わらない
    
    function isLeap($year) {
        return $year % 400 == 0 || $year % 100 != 0 &amp;&amp; $year % 4 == 0;
    }
    
    function lastDay($year, $month) {
        switch($month) {
            case 2:
                if (isLeap($year)) {
                    return 29;
                } 
                else {
                    return 28;
                }
            case 4:
            case 6:
            case 9:
            case 11:
                return 30;
            default:
                return 31;
        }
    }
    
    function nextDate($year, $month, $day) {
        $day++;
        if ($day &gt; lastDay($year, $month)) {
            $day = 1;
            $month++;
        }
        if ($month &gt; 12) {
            $month = 1;
            $year++;
        }
        return $a = array($year, $month, $day);
    }
    
    function countDay($year, $month, $day) {
        $y = 1800; $m = 1; $d = 1;
        $count = 0;
        while (!($y == $year &amp;&amp; $m == $month &amp;&amp; $d == $day)) {
            //1日ずつ先に進める
            $date = nextDate($y, $m, $d);
            $y = $date[0];
            $m = $date[1];
            $d = $date[2];
            $count++;
        }
        return $count;
    }
    
    // 1800年1月1日（水）から数えて、y年m月d日が何日先か
    $count = countDay($year, $month, $day);
    
    // 0:水　1:木　2:金　3:土　4:日　5:月　6:火　7:水（0と同じ）
    $days_of_week = array("水", "木", "金", "土", "日", "月", "火");
    
    printf("%s曜日", $days_of_week[$count % 7]);
?&gt;</pre></div>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/34-dateset-01-07-00584/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【DPメニュー】部分和問題 1 (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/18-dp_primer-06-01-00571/</link>
					<comments>https://chokomon.com/18-dp_primer-06-01-00571/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Mon, 15 Aug 2022 18:40:09 +0000</pubDate>
				<category><![CDATA[DPメニュー]]></category>
		<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1800]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6360</guid>

					<description><![CDATA[【DPメニュー】> 【部分和】STEP: 1 部分和問題 1 (paizaランク B 相当) [難易度: 1875 ±24] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/18-dp_primer/">DPメニュー</a>】> <a href="https://paiza.jp/works/mondai/dp_primer/dp_primer_partial_sums_step0" target="_blank" rel="noreferrer noopener">【部分和】STEP: 1 部分和問題 1 (paizaランク B 相当)</a> [難易度: <strong>1875 ±24</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/18-06-01-01.png" alt="" class="wp-image-6364"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>1 ~ n の番号がついた n 個のおもりがあり、おもり i の重さは a_i です。<br>おもりを何個か選んで重さの和が x となるようにすることができるかどうか判定してください。なお、同じおもりを2個以上選ぶことはできません。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">(ヒント)</h3>



<p>おもり 1 ~ n を用いて重さの和を x となるようにすることができるか、という問題を考えるために、部分問題としておもり 1 ~ n-1 を用いて重さの和を x となるようにすることができるか、という問題を考えてみましょう。</p>



<p>n-1 までのおもりを用いて重さの和を x または x-a_n となるようにすることができれば、おもり 1 ~ n を用いて重さの和を x となるようにすることができることがわかります。よって、最初はおもり 1 のみを使えることにして問題を解き、次にその結果を利用しておもり 1 ~ 2 を使えることにして問題を解く、ということを n まで繰り返せば、元の問題が解けそうです。</p>



<p>dp_k[x] を、おもり k までを用いて重さの和が x となるようにすることができるかどうかを表す真偽値とすると、上で考察した関係は漸化式で表すと&nbsp;<code>dp_k[x] = (dp_{k-1}[x] or dp_{k-1}[x-a_k])</code>&nbsp;となります。</p>



<p>dp_1, dp_2, ... と順に dp_n まで計算すれば問題の答えが求まります。dp_1 から dp_n のそれぞれに対応する n 本の1次元配列 (もしくはこれに相当する2次元配列) を使って実装してもよいのですが、dp_k[x] を求めるには dp_{k-1}[x] と dp_{k-1}[x-a_k] さえわかっていれば十分であることを踏まえると、ループの回し方を以下の様に工夫することで、これまでと同じように1本の1次元配列で解くことができます。</p>



<p class="has-gray-background-color has-background">for i = 0 to x<br>     dp[i] &lt;- false<br>dp[0] &lt;- true   // おもりを選ばなければ、重さの和を0とすることができる<br>for i = 1 to n  // おもり i までのおもりを使って<br>     for j = x down to a_i    // 重さの和を j とすることができるか？<br>         if dp[j-a_i] is true then<br>             dp[j] &lt;- true<br>if dp[x] is true then<br>     print "yes"<br>else     print "no" </p>



<p></p>



<p>j を x から a_i へ減らす方向にループを回していることに注意してください。逆に a_i から x へ 増やす方向にループを回すと正しく答えが求まらない可能性があります。理由を考えてみましょう (ヒント: n = 1, a_1 = 5, x = 10 のとき、ループの回し方によって答えはどうなるか？)</p>



<p></p>



<p><strong>入力値（例）</strong><br>5 19<br>7<br>18<br>5<br>4<br>8</p>



<p><strong>出力値（例）</strong><br>yes</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    list($n, $x) = explode(" ", trim(fgets(STDIN)));
    
    for ($i = 0; $i &lt; $n; $i++) {
        $a[] = trim(fgets(STDIN));
    }
    
    for ($i = 0; $i &lt;= $x; $i++) {
        $dp[$i] = false;
    }
    
    $dp[0] = true;
    
    for ($i = 0; $i &lt; $n; $i++) {
        for ($j = $x; $j &gt; $a[$i]-1; $j--) {
            if ($dp[$j - $a[$i]] == true) {
                $dp[$j] = true;
            }
        }
    }

    echo ($dp[$x] == true) ? "yes" : "no";
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="160" src="https://chokomon.com/wp-content/uploads/2022/08/18-06-01-02.png" alt="" class="wp-image-6365"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/18-dp_primer-06-01-00571/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【DPメニュー】最長部分増加列 (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/18-dp_primer-05-01-00569/</link>
					<comments>https://chokomon.com/18-dp_primer-05-01-00569/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Mon, 15 Aug 2022 17:44:00 +0000</pubDate>
				<category><![CDATA[DPメニュー]]></category>
		<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1800]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6346</guid>

					<description><![CDATA[【DPメニュー】&#62; 【部分列】STEP: 1 最長部分増加列 (paizaランク B 相当)&#160;[難易度:&#160;1867&#160;±24] ※リンク先へ移動するためには[paiza]へのログインが必要です。 解答例]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/18-dp_primer/">DPメニュー</a>】&gt; <a href="https://paiza.jp/works/mondai/dp_primer/dp_primer_lis_step0" target="_blank" rel="noreferrer noopener">【部分列】STEP: 1 最長部分増加列 (paizaランク B 相当)</a>&nbsp;[難易度:&nbsp;<strong>1867&nbsp;±24</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/18-05-01-01.png" alt="" class="wp-image-6347"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>n 本の木が横一列に並んでいます。左から i 番目の木を木 i と呼ぶことにします。木 i の高さは a_i [cm] です。<br>あなたは、何本かの木を伐採することによって、残った木を左から順に見ると高さが単調増加になっているようにしたいと考えています。つまり、残った木を左から 木 k_1, 木 k_2, ... , 木 k_m とすると、<code>a_{k_1} &lt; a_{k_2} &lt; ... &lt; a_{k_m}</code>&nbsp;が満たされているようにしたいです。なるべく多くの木が残るように、伐採する木を工夫して選んだとき、伐採されずに残る木の本数が最大でいくつになるか求めてください。<br>なお、最初から n 本の木が単調増加に並んでいる場合は、1本も伐採しなくてよいものとします。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">(ヒント)</h3>



<p>まずは問題を整理しましょう。この問題は、添字の部分列&nbsp;<code>x1 &lt; x2 &lt; ... &lt; xk</code>&nbsp;であって、<code>a_x1 &lt; a_x2 &lt; ... &lt; a_xk</code>&nbsp;を満たしているようなもの (これを、一般に増加部分列と呼びます) のうち、k が最も大きいもの (これを、一般に最長増加部分列 (Longest Increasing Subsequence, LIS) と呼びます) を求めよという問題に言い換えることができます。</p>



<p>dp[k] を、最後が木 k であるような増加部分列のうち最長であるものの長さとしてみましょう。dp[1] ~ dp[k-1] が求まっているとして、dp[k] とこれらの関係はどのようになっているかを考えてみましょう。</p>



<p>少し考えると、1以上 k 未満の i について a_i &lt; a_k が成り立っているとき、最後が木 i であるような増加部分列の最後に木 k をくっつけることで、新しく長さ dp[i] + 1 の増加部分列を作れることがわかります。そして、最後が木 k であるような最長増加部分列は、このようにして作られる部分列のうち最長のものであることがわかります。</p>



<p>これで、dp[1] ~ dp[k-1] と dp[k] の関係が明らかになりました。自信のある方は自分で漸化式を立ててみましょう。以下の疑似コードに従ってあなたの得意な言語で実装してみましょう。</p>



<p class="has-gray-background-color has-background">dp[1] &lt;- 1<br>for i = 2 to n<br>    dp[i] &lt;- 1  // 木 i のみからなる部分列の長さ<br>    for j = 1 to i-1<br>        if a[j] &lt; a[i] then<br>            dp[i] &lt;- max(dp[i], dp[j]+1) <br>　　　// 最後が木 j であるような増加部分列の末尾に木 i をくっつける<br> print max({dp[1], ... ,dp[n]})</p>



<p></p>



<p><strong>入力値（例）</strong><br>5<br>100<br>102<br>101<br>91<br>199</p>



<p><strong>出力値（例）</strong><br>3</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    $n = trim(fgets(STDIN));
    
    for ($i = 0; $i &lt; $n; $i++) {
        $a[] = trim(fgets(STDIN));
    }
    
    for ($i = 0; $i &lt; $n; $i++) {
        $dp[$i] = 1;
        for ($j = 0; $j &lt; $i; $j++) {
            if ($a[$j] &lt; $a[$i]) {
                $dp[$i] = max($dp[$i], $dp[$j]+1);
            }
        }
    }

    echo max($dp);
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="160" src="https://chokomon.com/wp-content/uploads/2022/08/18-05-01-02.png" alt="" class="wp-image-6348"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/18-dp_primer-05-01-00569/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【DPメニュー】最安値を達成するには 2 (paizaランク B)-解答例-PHP編</title>
		<link>https://chokomon.com/18-dp_primer-03-02-00564/</link>
					<comments>https://chokomon.com/18-dp_primer-03-02-00564/#respond</comments>
		
		<dc:creator><![CDATA[東鳥子]]></dc:creator>
		<pubDate>Sat, 13 Aug 2022 21:27:26 +0000</pubDate>
				<category><![CDATA[DPメニュー]]></category>
		<category><![CDATA[paiza-問題集]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ランクB]]></category>
		<category><![CDATA[難易度-1800]]></category>
		<guid isPermaLink="false">https://chokomon.com/?p=6304</guid>

					<description><![CDATA[【DPメニュー】&#62; 【最安値】STEP: 2 最安値を達成するには 2 (paizaランク B 相当)&#160;[難易度:&#160;1877&#160;±21] ※リンク先へ移動するためには[paiza]へのログインが必要です。 …]]></description>
										<content:encoded><![CDATA[
<p>【<a href="https://chokomon.com/paiza_mondai/18-dp_primer/">DPメニュー</a>】&gt; <a href="https://paiza.jp/works/mondai/dp_primer/dp_primer_apples_step1" target="_blank" rel="noreferrer noopener">【最安値】STEP: 2 最安値を達成するには 2 (paizaランク B 相当)</a>&nbsp;[難易度:&nbsp;<strong>1877&nbsp;±21</strong>]



<p>※リンク先へ移動するためには[<a href="https://paiza.jp/works" target="_blank" rel="noreferrer noopener">paiza</a>]へのログインが必要です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="300" src="https://chokomon.com/wp-content/uploads/2022/08/18-03-02-01.png" alt="" class="wp-image-6305"/></figure>



<div class="wp-block-dvaux-frame sc_frame_wrap inline"><div class="sc_frame_title inline" style="background-color:#ccc">問題文</div><div class="sc_frame" style="background-color:#fff;border-color:#ccc">
<p>八百屋にて、りんご2個が a 円で、りんご5個が b 円で売られています。<br>りんごの買い方を工夫したとき、n 個のりんごを手に入れるために必要な金額の最小値はいくらでしょうか。なお、買い方を工夫した結果、買ったりんごが n+1 個以上になってもよいものとします。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">(ヒント)</h3>



<p>前問の八百屋ではりんごが1個と2個で売られていましたが、本問の八百屋では2個と5個で売られています。この変更により、前問と同じようにして解こうとするとうまくいかなくなりました。理由を考えてみてください。</p>



<p>前問と同じように dp[n] をちょうど n 個のりんごを買うのに必要な金額の最小値とすると、dp[3] の値が正しく計算されないことがわかります。これは、りんごは2個ずつか5個ずつでしか買うことが出来ないため、3個のりんごをちょうど買う方法が存在しないからです。では、どうしたら dp[3] のような、2と5の組合せでは作れないような個数について最安値を計算することが出来るでしょうか。</p>



<p>問題文の最後の文に注目すると、買うりんごの数が3個以上になってもよいことがわかるので、ここで dp2[n] を n 個以上のりんごを買うのに必要な金額の最小値としてみましょう。dp と dp2 の定義から、<code>dp2[n] = min(dp[n], dp[n+1], ...)</code>&nbsp;であることがわかります。dp2[n] が求めたい答えになっています。</p>



<p>dp は dp[n] までではなく、余裕をもって dp[n+4] 程度まで計算しておく必要があることに注意しましょう (実はこの問題においては dp[n+2] まで計算しておけば十分なのですが、ある程度多めに計算しておくと安心です) 。また、実は新しく dp2 という配列を用意せずとも、dp をうまく書き換えることで答えを求めることもできます。余裕があれば考えてみてください (ヒント:ループを回す順番を工夫) 。</p>



<p></p>



<p><strong>入力値（例）</strong><br>4 110 200</p>



<p><strong>出力値（例）</strong><br>200</p>
</div></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">解答例</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php
    list($n, $a, $b) = explode(" ", trim(fgets(STDIN)));
    
    $dp[0] = 0;
    
    for ($i = 1; $i &lt;= ($n + 5); $i++) {
        $dp_a = $i &gt; 2 ? $dp[$i - 2] + $a : $a;
        $dp_b = $i &gt; 5 ? $dp[$i - 5] + $b : $b;
        
        $dp[$i] = min($dp_a, $dp_b);
    }
    
    echo $dp[$n];
?&gt;</pre></div>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="660" height="160" src="https://chokomon.com/wp-content/uploads/2022/08/18-03-02-02.png" alt="" class="wp-image-6306"/></figure>



<h2 class="wp-block-heading">解説</h2>



<p>この問題の漸化式は、dp[k] = min(dp[k - 2] + a, dp[k - 5] + b)となります。解答例では三項演算子を使いましたが、if()で書くと以下のようになります。</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php    
    if ($i &gt; 2) {
        $dp_a = $dp[$i - 2] + $a;
    } else {
        $dp_a = $a;
    }
    
    if ($i &gt; 5) {
        $dp_b = $dp[$i - 5] + $b;
    } else {
        $dp = $b;
    }
?&gt;</pre></div>
]]></content:encoded>
					
					<wfw:commentRss>https://chokomon.com/18-dp_primer-03-02-00564/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
