買不到的數目 - 藍橋杯

歡迎訪問我的新博客: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;
}

(全文完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章