質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java Development Kit

Java Development Kit(JDK)とは、Javaでの開発のために要するソフトウェアをまとめたパッケージです。コンパイラの「Javac」やクラスライブラリの「jar」など、Java開発者向けツールが含まれています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

481閲覧

最も支払額が少なくなる際の購入代金のプログラム

fi4tb

総合スコア2

Java Development Kit

Java Development Kit(JDK)とは、Javaでの開発のために要するソフトウェアをまとめたパッケージです。コンパイラの「Javac」やクラスライブラリの「jar」など、Java開発者向けツールが含まれています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2023/02/09 01:24

実現したいこと

ここに実現したいことを箇条書きで書いてください。
n番目の商品を半額にすると最も金額が少なくなるプログラム

前提

listに入っている値を順番に半額にするアルゴリズムがわかりません。
現在入力するところまでのプログラムはできています。

(実現したいプログラム)
あなたはスーパーに買い物に来ています。
このスーパーでは現在半額セールが開催されており、購入した商品の中から一種類の商品を選び価格を半額にすることができます。
選んだ商品を複数個買っている場合は、その商品の複数個の合計金額が半額になります。
なお、半額にした際に小数点以下の金額が発生する場合、金額を切り上げします。

あなたは、 p1 円の商品を a1 個、 p2 円の商品を a2 個…と、全部で N 種類の商品を購入しようとしています。
半額セールを利用し、最も支払額が少なくなる際の購入代金を出力してください

入力される値

N
p_1 a_1
p_2 a_2
...
p_N a_N

制約

N,pi,ai:整数
1≤N≤10^4
1≤pi≤10^7
1≤ai≤10^7

サンプルケース1

[入力値]
4
80 7
500 1
20 10
30 17
[出力値]
1490

[説明]
半額にする商品をそれぞれ選ぶと、支払う金額は以下のようになります。
半額にする商品 金額
1 : 1490
2 : 1520
3 : 1670
4 : 1515

1番目の商品を半額にすると最も金額が少なくなります。
よって、支払う金額の最小値は 1490 となります。

サンプルケース2

[入力値]
4
1000 5
1000 50
1000 567
1000 5432
[出力値]
3338000

サンプルケース3

[入力値]
3
11 3
15 7
299 1
[出力値]
288
[説明]
3 番目の商品を半額にすることで、支払う金額は最小となります。
299 の半額は 149.5 ですが、小数点以下の金額の場合切り上げ、 150 円とします。

該当のソースコード

java

1ソースコード 2public static void main(String[] args) { 3 Scanner scnn = new Scanner(System.in); 4 System.out.print("種類を入力してください:"); 5 int N = scnn.nextInt(); 6 int a, p; 7 List<Integer> list1 = new ArrayList<>(); 8 List<Integer> list2 = new ArrayList<>(); 9 for (int i = 0; i < N; i++) { 10 System.out.print("価格を入力してください:"); 11 p = scnn.nextInt(); 12 list1.add(i, p); 13 14 System.out.print("個数を入力してください:"); 15 a = scnn.nextInt(); 16 list2.add(i, a); 17 } 18 List<Integer> total = new ArrayList<>(); 19 for (int i = 0; i < N; i++) { 20 total.add(list1.get(i)*list2.get(i)); 21 System.out.println(list1.get(i) + " " + list2.get(i)); 22 } 23}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2023/02/09 01:58

問題の出典はどこでしょうか。
fi4tb

2023/02/09 01:59

学校の課題です
episteme

2023/02/09 02:48

「total中の最大値」がわかれば、totalの総和 - total中の最大値/2 が求めるものではなくて?
guest

回答1

0

ベストアンサー

「i番目の商品を半額で買った場合の合計金額」は「すべての商品を定額で買った場合の合計金額」から「i番目の商品を半額することによって割り引かれる金額」を引くことにより求めることができます。これを利用してすべてのiについて、半額で買った場合の合計金額を計算し、その最小値を求めればよいです。

java

1Scanner scanner = new Scanner(System.in); 2 3// 入力を読み込む。 4int n = scanner.nextInt(); 5long[] p = new long[n]; 6long[] a = new long[n]; 7for (int i = 0; i < n; i++) { 8 p[i] = scanner.nextLong(); 9 a[i] = scanner.nextLong(); 10} 11 12// すべての商品を定額で買った場合の金額を求める。 13long total = 0; 14for (int i = 0; i < n; i++) { 15 total += p[i] * a[i]; 16} 17 18// i番目の商品を半額で買った場合の金額を計算し、その最小値を求める 19long min = Integer.MAX_VALUE; 20for (int i = 0; i < n; i++) { 21 // i番目の商品を半額で買った場合の合計金額 22 long price = total - (p[i]/2*a[i]); 23 min = Math.min(min, price); 24} 25 26System.out.println(min);

投稿2023/02/09 02:58

neko_the_shadow

総合スコア2230

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2023/02/09 03:12 編集

> 選んだ商品を複数個買っている場合は、その商品の複数個の「合計金額」が半額になります。 とあるので、 long price = total - (p[i]/2*a[i]); は long price = total - (p[i]*a[i]/2); が正しいかと。
fi4tb

2023/02/09 03:58

epistemeさん、neko_the_shadowさんありがとうございます。おかげで理解できました!
jimbe

2023/02/09 04:28

>半額にした際に小数点以下の金額が発生する場合、金額を切り上げ この辺り大丈夫でしょうか。
fi4tb

2023/02/09 05:35

if文で小数点だったら切り上げるというプログラムを追加したので大丈夫です。 わざわざありがとうございます。
Zuishin

2023/02/09 06:10

切り上げというのは引き算で切り捨てになるよう考えられているものだと思います。 わざわざ分岐しなくても、整数の演算だけで答えが出ます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問