第十二届蓝桥杯省赛A组砝码称重Java解题思路及代码
生活随笔
收集整理的這篇文章主要介紹了
第十二届蓝桥杯省赛A组砝码称重Java解题思路及代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【問題描述】
你有一架天平和 N個砝碼,這N個砝碼重量依次是W1, W2, …, Wn。
請你計算一共可以稱出多少種不同的重量?注意砝碼可以放在天平兩邊。
【輸入格式】
輸入的第一行包含一個整數N。
第二行包含N個整數: W1, W2, W3, … Wn。
【輸出格式】
輸出一個整數代表答案。
【樣例輸入】
3
146
【樣例輸出】
10
解題思路:①有第一個砝碼:x1,則可測出的重量有x1;②有第二個砝碼:x2,則可測出的重量有x1、x1+x2、|x1-x2|、x2(相同的僅算一次);③有第三個砝碼:x3,則可測出的重量有x1、x1+x2、|x1-x2|、x2、x1+x3、|x1-x3|、x1+x2+x3、|x1+x2-x3|…(相同的僅算一次)。基于上述分析,我們需要使用不存儲相同數據的HashSet來存儲結果更為方便,而對于每增加一個砝碼可能產生的情況,我們可以把前一個砝碼產生并存儲的情況拿過來與之進行處理產生更多的情況并存儲。
Java代碼:
import java.util.HashSet; import java.util.Iterator; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();//使用HashSet對能夠稱出的重量進行存儲,因為HashSet不能存儲相同值正是我們需要的。HashSet<Integer> weightCase = new HashSet<>();//將第一個砝碼值直接存進去int first = scanner.nextInt();weightCase.add(first);//從第二個砝碼開始while (n > 1){int x = scanner.nextInt();//借助一個臨時HashSet存儲該砝碼加入時與前面的砝碼配合可能產生的情況HashSet<Integer> temp = new HashSet<>();//遍歷weightCaseIterator<Integer> iterator = weightCase.iterator();while (iterator.hasNext()){int t = iterator.next();temp.add(t + x);temp.add(Math.abs(t - x));}//將添加該砝碼之后可得的重量情況存儲進去weightCase.addAll(temp);weightCase.add(x);n--;}//除去重量為0這種情況weightCase.remove(0);System.out.println(weightCase.size());} } import java.util.HashSet; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);HashSet<Integer> set = new HashSet<>();int n = scanner.nextInt();set.add(scanner.nextInt());for (int i = 1; i < n; i++) {int fama = scanner.nextInt();HashSet<Integer> temp = new HashSet<>();for (Integer item : set) {temp.add(item + fama);temp.add(Math.abs(item - fama));}temp.add(fama);set.addAll(temp);}set.remove(0);System.out.println(set.size());} }總結
以上是生活随笔為你收集整理的第十二届蓝桥杯省赛A组砝码称重Java解题思路及代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度app如何开启无痕浏览(百度产品大全
- 下一篇: 408考研数据结构复习-时间复杂度与空间