[プログラマー]無傷の矩形


MINDOLです


こんにちは!
皆さんお元気ですか?私はコロナ市局で家と団地のカフェだけを往復しています.
カフェで一度コーヒーを洗うときもマスクをします
では、アイスアメリカンコーヒーを1口飲む気持ちで解きましょう.

正方形


質問リンク

この問題は、例からすばやく理解できます.

初めて問題を読んだとき、どうやって近づくか悩んだ.
これは、長方形のパターンと数が横方向と縦方向の長さによって異なるためです.
皆さんは初めて問題を見てどのように接近しましたか?
対角線なので、縦の出発時間と到着時間は同じなので、速度の概念で近づきたいです.
横方向の長さw、縦方向の長さhの場合、横方向の移動速度は1である.
垂直移動速度はh/wである.

整理する

  • 横長で文を繰り返す(横長1マス移動時縦移動h/wマス)
  • が移動すると、長手方向の長さの上昇から移動前の長手方向の長さの低下を減算する.
    (ここから横1マスで削除する矩形数がわかる)
  • の横長で移動し、消去し続ける矩形の個数を求める.
  • 水平長を基準として対角線の長手方向速度を考慮
    消去する矩形の個数を数えてください.
    本当に文字で整理すると特にないような気がしますが、この方法は大変だと思います.
    また,実数の演算量が大きくなると誤差が生じる可能性がある.
    だから私は整数変数だけを使って値を求めているので、問題を解く時間が長くなったようです.
    ではjavaコードを見てみましょう.
    class Solution {
    	public long solution(long w, long h) {	// int형은 w*h의 값이 범위를 벗어나서 바꿔줌
    		long cnt = 0;
    		for (int i=0; i<w; i++)		// 가로 길이만큼 반복
    			cnt += ((h * (i + 1) + w - 1) / w) - (h * i / w);  // 지워지는 사각형
    		return ((w * h) - cnt);		// 전체 사각형 개수에서 뺸다
    	}
    移動前の縦方向の長さが下がる整数式
    h * i / w
    移動後に垂直に長くなる整数式
    (h * (i + 1) + w - 1) / w
    実数演算に誤差がある可能性があるため,この方法を採用した.
    整数の除算を利用すると残りは捨てられます
    悩む時間に比べてコードが短い.
    今日のポスターはここまでにしましょうでは.

    20000