ACMの問題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bun

ACMの問題

#1

投稿記事 by bun » 15年前

初投稿になります
ACMの問題を解いています。お手数ですが問題は以下のURLからお願いします
http://www.acm-japan.org/past-icpc/dome ... ll_ja.html
解決しました。
協力してくださったお二方に大変感謝します。

sizuma

Re:ACMの問題

#2

投稿記事 by sizuma » 15年前

scanfの中で,を使ってるからおかしな動作をするのでしょう。
こういうときはデバッグ機能を使って変数の中身を確かめてみてください。
scanfの後にprintfで出力する、とかね。

というか、この問題をコンソールから入力するのは・・・・
テキストファイルにコピペしてinputデータにするべきだと思いますよ。

bun

Re:ACMの問題

#3

投稿記事 by bun » 15年前

ありがとうございます。
正常に動くようになりました。
ただまだ、いくらか問題があるので続けて質問させていただきます。
申し遅れましたが当方C言語はまだまだ初心者です。

問題文にある「なお,合計を等しくするようなカードの交換の方法が複数ある場合は,交換するカードの点数の和が最小となるものを出力すること」というような条件を満たす条件文がわかりません。
現状を添付しておきます。
また「合計を等しくする交換はありません」を表示させることができません。
どこに間違いがあるのでしょうか?

mats

Re:ACMの問題

#4

投稿記事 by mats » 15年前

うーん…,とても惜しいです.

『A_changed_sum と B_changed_sum が等しくなったとき』にA_answer と B_answer に代入を行っていますが,
その時点で代入を行うのはまだ早いです.

『合計が等しくなった時,かつ A_answer と B_answer の和よりもA と B[j] の和が小さい時』に代入を行うのが正解です.
(そのためには, A_answer と B_answer を宣言した時に大きな数字で初期化を行っておく必要があります)


合計が等しくなる交換が無かった場合の条件ですが,
『A_answer と B_answer が等しい時』でなく,『A_answer と B_answer が初期化した数字から変わっていなかった時』という条件にすればいいかと思われます.
printfは最後に(2つのfor文を抜けてから)一度だけ行ってください.

while文に関してはちょっと意味がわかりませんでした….


現時点のプログラムでは複数問を連続で解くことができませんが,それでよろしいのでしょうか?

bun

Re:ACMの問題

#5

投稿記事 by bun » 15年前

返答大変ありがとうございます。
プログラムを書き直してみたのですが・・やはりできません
ご指摘お願いします。

mats

Re:ACMの問題

#6

投稿記事 by mats » 15年前

if文の書き方が間違っています.
他の部分では合っているので,恐らく単純なミスだとは思いますが….
A_answer==999999&&B_answer==999999ではないでしょうか?

それと,print文は最後に持ってきてください.
このプログラムだとreturn 0の前に書けばいいかと思われます.
最後に持ってきた場合には,出力はA,B[j]ではなく,A_answer,B_answerに直すのもお忘れなく.

bun

Re:ACMの問題

#7

投稿記事 by bun » 15年前

何度もありがとうございます。
printの方は改善させることができました。
デバックしてみたのですが、画像のようにやはり答えが2通り出てしまいます。
プログラムの目標は画像の交換するカードが1と3の時のみを表示させることです。
これまで教えてもらったことから、間違いはないと思うのですが・・
まだ何か不足していることがあるのでしょうか?

mats

Re:ACMの問題

#8

投稿記事 by mats » 15年前

おや…,現時点でのプログラムを見せて頂けますか?


それと,指摘が遅れてしまい申し訳ないのですが,
if(A_answer+B_answer>A+B[j]){
    A_answer = A;
    B_answer = B[j];
}else{
    if(A_answer!=B_answer){
        A_answer = A;
        B_answer = B[j];
    }
}

の二つ目の代入(A_answer!=B_answer)の部分は消してください.
これもちょっと意味がわからなかったのですが,先ほど指摘するのを忘れていました.

bun

Re:ACMの問題

#9

投稿記事 by bun » 15年前

本当にお手数をおかけします。
現時点でのプログラムは以下の通りです。
解が複数でてしまう以外は正常に動きます。

mats

Re:ACMの問題

#10

投稿記事 by mats » 15年前

交換すべきカードは~のprint文も最後に書いてください.

ループの中に書いてしまうと,交換できる組み合わせを見つけるたびに表示されてしまいます.

bun

Re:ACMの問題

#11

投稿記事 by bun » 15年前

うまくいきました。本当にありがとうございました!
初歩的なミスが多くてすいませんでした。これからもっとしっかり勉強していきたいと思います。
私的な事情により載せたソースは消します。
こんな朝まで付き合ってもらって本当に感謝します。

閉鎖

“C言語何でも質問掲示板” へ戻る