第十届 蓝桥杯样题 —— 5个砝码
生活随笔
收集整理的這篇文章主要介紹了
第十届 蓝桥杯样题 —— 5个砝码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【5個砝碼】
用天平稱重時,我們希望用盡可能少的砝碼組合稱出盡可能多的重量。如果只有5個砝碼,重量分別是1,3,9,27,81。則它們可以組合稱出1到121之間任意整數重量(砝碼允許放在左右兩個盤中)。本題目要求編程實現:對用戶給定的重量,給出砝碼組合方案。例如:
用戶輸入:5程序輸出:9-3-1用戶輸入:19程序輸出:27-9+1要求程序輸出的組合總是大數在前小數在后??梢约僭O用戶的輸入的數字符合范圍1~121。【解題思路提示】
我們把已知的砝碼序列記為:x1, x2, x3, x4, x5, x6 (這里多加一個標準砝碼,為解題敘述方便)對于任意給定的重量x,如果剛好等于xi 則問題解決。否則一定會位于兩個標準砝碼重量的中間,不妨設為:xi < x < xj令 a = x – xi, b = xj – x則,x 要么可以表示為: xi + a, 要么可以表示為: xj – b這樣問題就歸結為怎樣表示出 a 或 b另一思路:對于每個xi,可以乘以一個系數ki,再求和。ki的數值無外乎:-1 0 1這樣,因為標準砝碼的數量的很少的,我們就可以多層循環暴力組合ki來求解。還有更“土氣”但有效的思路:既然輸入范圍只有120左右,如果對每一種情況都做人工求解,只要列一個大表,等查詢的時候,直接輸出答案就好了啊!但…這似乎是個耗時的工程…代碼
#include <iostream> using namespace std; int weights[5]={1,3,9,27,81}; int main() {int n;cin>>n; // a*1+b*3+c*9+d*27+e*81==n // a,b,c,d,e都屬于(-1,0,1)for(int a=-1;a<=1;a++){for(int b=-1;b<=1;b++){for(int c=-1;c<=1;c++){for(int d=-1;d<=1;d++){for(int e=-1;e<=0;e++){if(a*1+b*3+c*9+d*27+e*81==n){if(e==1) cout<<81;if(d==1&&e==1) cout<<'+'<<27;if(d==1&&e==0) cout<<27;if(d==-1) cout<<'-'<<27;if(c==1&&(e==1||d==1)) cout<<'+'<<9;if(c==1&&e==0&&d==0) cout<<9;if(c==-1) cout<<'-'<<9;if(b==1&&(e==1||d==1||c==1)) cout<<'+'<<3;if(b==1&&e==0&&d==0&&c==0) cout<<3;if(b==-1) cout<<'-'<<3;if(a==1&&(e==1||d==1||c==1||b==1)) cout<<'+'<<1;if(a==1&&e==0&&d==0&&c==0&&b==0) cout<<1;if(a==-1) cout<<'-'<<1;}}}}}}return 0; }總結
以上是生活随笔為你收集整理的第十届 蓝桥杯样题 —— 5个砝码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机精英协会考核题 —— 第三题:斐波
- 下一篇: 2017年第八届蓝桥杯 - 省赛 - C