顛倒的價牌 - 藍橋杯

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

(全文完)

發佈了98 篇原創文章 · 獲贊 12 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章