atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
frostar@wiki
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
frostar@wiki
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
frostar@wiki
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • frostar@wiki
  • 新人女子の書いたコードを直すやつ

frostar@wiki

新人女子の書いたコードを直すやつ

最終更新:2013年12月27日 15:31

frostar

- view
管理者のみ編集可
問題はここにあります。
要約すると
N D
p_1
p_2
...
p_N
m_1
m_2
...
m_D
という書式の入力が与えられ、それぞれのm_iに対して和がm_iを超えない最大の値になるようにp_jから異なる2個を選択するというものです。

とりあえず私の最終コードは↓みたいな感じ。言語はJavaです。
  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.List;
  6. public class Main {
  7. private static List<Integer> goods;
  8. public static void main(String args[]) throws Exception {
  9. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  10. String line = br.readLine();
  11. String[] strs = line.split(" ");
  12. int g_max = Integer.valueOf(strs[0]);
  13. int d_max = Integer.valueOf(strs[1]);
  14. goods = new ArrayList<Integer>(g_max);
  15. int[] targets = new int[d_max];
  16.  
  17. for(int i=0;i<g_max;i++){
  18. goods.add(Integer.parseInt(br.readLine()));
  19. }
  20. Collections.sort(goods);
  21.  
  22. for(int i=0;i<d_max;i++){
  23. System.out.println(calc(Integer.parseInt(br.readLine())));
  24. }
  25. }
  26. static int calc(int target){
  27. if(target/2<goods.get(0))return 0;
  28. int end = goods.size()-1;
  29. if(target/2>=goods.get(end))return goods.get(end)+goods.get(end-1);
  30. int answer=0;
  31. int start=0;
  32.  
  33. while(start<end){
  34. int s=0;
  35. while(goods.get(end)+goods.get(start)>target)end--;
  36. s = goods.get(end)+goods.get(start);
  37. if(s==target){
  38. answer = s;
  39. break;
  40. }
  41. if(answer<s)answer = s;
  42. start++;
  43. }
  44. return answer;
  45. }
  46. }
  47.  
とりあえずmainではそれぞれの値を取得。
与えられたgoods(p_j)をソートしてから、calcメソッドにそれぞれの目標値を渡して計算を行っています。
calcメソッドでは次のようなものは計算を行わなくても解がわかるのでそれを先に判別します。
  • 一番小さいgoodsの要素の値段が目標値の半分以上のとき:0(line.32)
  • 一番大きいgoodsの要素の値段が目標値の半分以下のとき:一番大きいgoodsの要素+二番目に大きいgoodsの要素(line.34)

それ以外の場合はそれぞれの計算を行います。
startとendという2つのindexをそれぞれ0とgoodsの要素数-1で初期化します。
また、中間結果変数answerを0で初期化します。
startの要素とendの要素の和が目標値以下になるまでendをデクリメントしていきます(line.35)。
目標値以下になったら、その合計値を目標値と比較し、等しければその値を答えとして返します。
そうでなければ、変数answerと合計値を比較し、合計値のほうが大きければanswerの値を更新します。
その後、startをインクリメントして、同じ処理をstartとendの大小関係が入れ替わるか等しくなるまで続けます。

startとendはループ中で常にstart<endが成り立っており、goodsがソートされているために
goods[start]<goods[end]が成り立ちます。
また、goods[start]<goods[start+1]も成り立つので、
goods[start]+goods[end]が目標値より大きい場合、
goods[start+1]+goods[end]も必ず目標値より大きくなります。
そのため、goods[start]+goods[end]<目標値が満たされた場合、
次の探索はgoods[start+1]に加算して目標値よりも小さくなるのはgoods[end]よりも小さい要素となるので、
ひとつ前のendより大きい値を探索する必要がなくなり、計算量が削減されます。

このアルゴリズムだとだいたいテストケース1で0.09秒でした。
Java最速は0.06秒らしいのでもっと早い方法があると思います(それともインスタンス生成コストとかをもっと減らしてるのかしら?)。
一応タイムを縮める方法として、目標値以下となる値を見つけるのを二分探索にしたり、マルチスレッドにしてみたりもやってみたのですが、いまいち縮まらなかったですね。
「新人女子の書いたコードを直すやつ」をウィキ内検索
LINE
シェア
Tweet

[Amazon商品]


frostar@wiki
記事メニュー

メニュー

  • トップページ
  • プロフィール
  • コメント
    • 足跡
    • ツール
    • その他
  • 公開・更新状況について
作ったもの
  • 注意事項
  • TRPG支援ツール
    • SW2.0
      • キャラ管理ツールver2
      • 表出力ツール
      • 抽出ツール
    • でたとこサーガ
      • でたとこツール
    • 永い後日談のネクロニカ
      • キャラ管理ツール
    • その他
      • 2次元戦闘管理ツール
  • LimeChat2用マクロ
    • インストール・設定
    • 直線距離管理ツール
      • Reference
    • HPMPツール
      • Reference
    • 汎用ランダム出力ツール
      • Reference
    • 汎用デッキツール
      • Reference
  • ライブラリ
    • C++
      • ListViewEx

過去の遺物
  • ソフトの配布について
  • お手伝いについて
  • SW2.0
    • キャラ管理ツール
      • FAQ
    • GMツール
    • モンスターツール
  • DX3rd
    • キャラ管理ツール
  • 迷宮キングダム
    • キャラ管理ツール
    • まよきんダイス
  • それ以外
    • ADVスクリプタ
  • 作りたいもの
TRPG
  • コラム
    • コラムについて
    • TRPGとは
    • オンラインセッションについて
    • GM向け
      • GMを始める前に
      • シナリオの作り方
      • マスタリング
  • システム紹介
    • SW2.0
      • 基本ルールブック
      • データ系サプリメント
      • データ系サプリメント2
      • プレイヤーズハンドブック
      • シナリオ系サプリメント
      • ツアー系サプリメント
  • データ
    • SW2.0
      • モンスターデータ
プログラム
  • プログラムを始める人へ
  • プログラムメモ
    • データ構造
      • リスト構造
    • 時間計測
    • FPS管理
    • 数学関数
    • 文字列操作関数
      • strrep
    • 描画関数
      • TransparentAlphaBlt
      • RotateBlt
      • RotateTransparentAlphaBlt
      • 描画関数の時間比較
    • 知っておくと便利
    • コントロール
      • 色を変える
      • チェックボックス付きリストビュー
    • C++標準ライブラリ系
      • StringSplit
      • AccessIterator
      • Java風Iterator
    • winsock系
      • WebSocketサーバ
    • JavaScript系
      • JSONPででたとこのデータ取得
  • CodeIQ
    • 結城浩さんの問題
      • Bits
      • Nick
      • Scissors
    • Paiza Online Hackathon
      • 新人女子の書いたコードを直すやつ
リンク

自分関係

  • リンクについて
ここのページへのリンクについてはこちら
  • ブログ:幾星霜
TRPGのセッション記録とかメインのブログ
  • USTREAM:frostのプログラム雑談室
生配信チャンネル。プログラム<雑談
気が向いたときにやります
  • THE INTERVIEWS
個人的な質問に答えてます。

TRPG系

  • 月光華亭
お世話になっているオンラインセッションサイト
  • TRPG.NET
TRPGのことならここ!
IRCサーバなど、お世話になってます。
  • 屍少女たちの永い午睡(相互)
ネクロニカの支援サイトです。ツール開発やオンセもやっています。

プログラム系

  • 猫でもわかるプログラミング
初心者のためのプログラムのページ。WindowsSDKの方についても詳しく書いています。
  • 窓プログラミング
windowsSDKのテクニックがいろいろ書いてあります。
  • C/C++リファレンス
C++STL(標準テンプレートライブラリ)の日本語版リファレンスです。

@frost_star からのツイート

更新履歴

取得中です。


ここを編集
記事メニュー2
最近更新されたページ
  • 2015日前

    足跡
  • 3751日前

    JSONPででたとこのデータ取得
  • 3751日前

    メニュー
  • 3756日前

    でたとこサーガ支援ツール
  • 3756日前

    表出力ツール
  • 3757日前

    直線距離管理ツール
  • 3764日前

    直線距離管理ツール:Reference
  • 3764日前

    SW2.0キャラ管理ツールver2
  • 3843日前

    汎用ランダム出力ツール:Reference
  • 3843日前

    汎用デッキツール
もっと見る
最近更新されたページ
  • 2015日前

    足跡
  • 3751日前

    JSONPででたとこのデータ取得
  • 3751日前

    メニュー
  • 3756日前

    でたとこサーガ支援ツール
  • 3756日前

    表出力ツール
  • 3757日前

    直線距離管理ツール
  • 3764日前

    直線距離管理ツール:Reference
  • 3764日前

    SW2.0キャラ管理ツールver2
  • 3843日前

    汎用ランダム出力ツール:Reference
  • 3843日前

    汎用デッキツール
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. 鹿乃つの氏 周辺注意喚起@ウィキ
  2. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  3. MadTown GTA (Beta) まとめウィキ
  4. R.E.P.O. 日本語解説Wiki
  5. シュガードール情報まとめウィキ
  6. ソードランページ @ 非公式wiki
  7. AviUtl2のWiki
  8. Dark War Survival攻略
  9. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  10. 星飼いの詩@ ウィキ
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 初音ミク Wiki
  5. 発車メロディーwiki
  6. 検索してはいけない言葉 @ ウィキ
  7. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
  8. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  9. パタポン2 ドンチャカ♪@うぃき
  10. オレカバトル アプリ版 @ ウィキ
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 参加者一覧 - ストグラ まとめ @ウィキ
  2. 暦家 - ストグラ まとめ @ウィキ
  3. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  4. 機体一覧 - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  5. 猗窩座(鬼滅の刃) - アニヲタWiki(仮)
  6. マイティーストライクフリーダムガンダム - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  7. Trickster - ストグラ まとめ @ウィキ
  8. MOZU - ストグラ まとめ @ウィキ
  9. 暦 あずみ - ストグラ まとめ @ウィキ
  10. ガヴァイ アッカンマン - ストグラ まとめ @ウィキ
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.