歡迎訪問我的新博客:http://www.milkcu.com/blog/
原文地址:http://www.milkcu.com/blog/archives/1395373140.html
引言
這是2013年藍橋杯全國軟件大賽預賽A組(C/C++組),第四題,爲填空題,思路是枚舉。
題目描述
標題: 顛倒的價牌
小李的店裏專賣其它店中下架的樣品電視機,可稱爲:樣品電視專賣店。
其標價都是4位數字(即千元不等)。
小李爲了標價清晰、方便,使用了預製的類似數碼管的標價籤,只要用顏色筆塗數字就可以了(參見p1.jpg)。
這種價牌有個特點,對一些數字,倒過來看也是合理的數字。如:1 2 5 6 8 9 0 都可以。這樣一來,如果牌子掛倒了,有可能完全變成了另一個價格,比如:1958 倒着掛就是:8561,差了幾千元啊!!
當然,多數情況不能倒讀,比如,1110 就不能倒過來,因爲0不能作爲開始數字。
有一天,悲劇終於發生了。某個店員不小心把店裏的某兩個價格牌給掛倒了。並且這兩個價格牌的電視機都賣出去了!
慶幸的是價格出入不大,其中一個價牌賠了2百多,另一個價牌卻賺了8百多,綜合起來,反而多賺了558元。
請根據這些信息計算:賠錢的那個價牌正確的價格應該是多少?
答案是一個4位的整數,請通過瀏覽器直接提交該數字。
注意:不要提交解答過程,或其它輔助說明類的內容。
分析
該題的總體思路是枚舉所有的價格,當然這個過程要排除不符合要求的解。
倒過來看數字合理的數字有:1, 2, 5, 6, 8, 9, 0。
而數字的值改變的只有:6變爲9,9變爲6。
雖然最後的結果能夠得到好幾組解,但巧妙的是賠錢的那個加派的正確價格均爲9088。
代碼實現
#include <iostream>
using namespace std;
int check(int x) {
int vis[10] = {1, 1, 1, 0, 0, 1, 1, 0, 1, 1};
do {
if(vis[x % 10] == 0) {
return 0;
}
} while(x /= 10);
return 1;
}
int reverse(int x) {
int r = 0;
do {
int b = x % 10;
if(b == 6) {
b = 9;
} else {
if(b == 9) {
b = 6;
}
}
r = 10 * r + b;
} while(x /= 10);
return r;
}
int main(void) {
//cout << reverse(8561) << endl;
for(int i = 1001; i <= 9999; i++) {
if(!check(i)) {
continue;
}
int ir = reverse(i);
int ip = i - ir;
if(ip < 200 || ip >= 300) {
continue;
}
for(int j = 1001; j <= 9999; j++) {
if(!check(j)) {
continue;
}
int jr = reverse(j);
int jz = jr - j;
if(jz < 800 || jz >= 900) {
continue;
}
if(jz - ip == 558) {
cout << i << endl;
cout << i << ", " << j << endl;
}
}
}
cout << "Done." << endl;
return 0;
}
答案
9088
(全文完)