歡迎訪問我的新博客:http://www.milkcu.com/blog/
原文地址:http://www.milkcu.com/blog/archives/1395404220.html
引言
這是2013年第四屆藍橋杯全國軟件大賽預賽A組(C/C++組)第8題,爲編程題,本文提供了兩種解法。
題目描述
標題:買不到的數目
小明開了一家糖果店。他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。
小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。
你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。大於17的任何數字都可以用4和7組合出來。
本題的要求就是在已知兩個包裝的數量時,求最大不能組合出的數字。
輸入:
兩個正整數,表示每種包裝中糖的顆數(都不多於1000)
要求輸出:
一個正整數,表示最大不能買到的糖數
不需要考慮無解的情況
例如:
用戶輸入:
4 7
程序應該輸出:
17
再例如:
用戶輸入:
3 5
程序應該輸出:
7
資源約定:
峯值內存消耗 < 64M
CPU消耗 < 3000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多餘內容。
所有代碼放在同一個源文件中,調試通過後,拷貝提交該源碼。
注意: main函數需要返回0
注意: 只使用ANSI C/ANSI C++ 標準,不要調用依賴於編譯環境或操作系統的特殊函數。
注意: 所有依賴的函數必須明確地在源文件中 #include <xxx>, 不能通過工程設置而省略常用頭文件。
提交時,注意選擇所期望的編譯器類型。
分析
這題看上去讓人摸不着頭腦,不知如何下手。
第一種思路是枚舉法。
首先要找出枚舉上界,枚舉上界爲最大可能買不到的數,好像是兩數的最小公倍數,不知爲何?
當然數據量較小的時候,我直接取了兩數之積,在練習評測系統中也可以通過。
然後就是遍歷每種包裝的數目,限制條件爲最大可能買不到的數目,並把結果保存到數組中。
最後遍歷數組得到最後答案。
第二種思路是個公式。
假設第一種包裝中糖的顆數爲a,第二種包裝中糖的顆數爲b,則最大不能組合出的數字爲a * b - a - b。
這公式不知如何推導,多列舉幾組數可以歸納出來,練習評測系統也可以通過。
代碼實現
枚舉法
#include <iostream>
#include <cstring>
#include <algorithm>
#define MAXN 1000001
using namespace std;
int vis[MAXN];
int main(void) {
int a, b;
cin >> a >> b;
int maxn = a * b;
memset(vis, 0, sizeof(vis));
for(int i = 0; i * a <= maxn; i++) {
for(int j = 0; j * b <= maxn; j++) {
if(i * a + j * b > maxn) {
break;
}
vis[i * a + j * b] = 1;
}
}
for(int i = maxn; i > 0; i--) {
if(vis[i] == 0) {
cout << i << endl;
break;
}
}
return 0;
}
公式法
#include <iostream>
using namespace std;
int main(void) {
int a, b;
cin >> a >> b;
cout << a * b - a - b << endl;
return 0;
}
(全文完)