2012 藍橋杯【初賽試題】賣雞蛋
題目描述:
大數學家歐拉在集市上遇到了本村的兩個農婦,每人跨著個空籃子。她們和歐拉打招唿說兩人剛剛賣完了所有的雞蛋。
歐拉隨便問:“賣了多少雞蛋呢?”
不料一個說:“我們兩人自己賣自己的,一共賣了150個雞蛋,雖然我們賣的雞蛋有多有少,但剛好得了同樣的錢數。你猜猜看!”
歐拉猜不出。
另一個補充道:“如果我按她那樣的價格賣,可以得到32元;如果她按我的價格賣,可以得到24.5元”。
歐拉想了想,說出了正確答案。
我們不是數學家,懶得列出公式來分析。但計算機可以“暴力破解”,就是把所有可能情況都試驗一遍,撞上為止!
請寫出每人雞蛋的數目(順序不限),用逗號隔開。
答案寫在“解答.txt”中,不要寫在這裏!
思路:題目說要用暴力搜索,其實暴力搜索也是需要先梳理優化好再暴力的,
假設兩人賣得雞蛋數目為x,y,價錢分別為m1,m2。
根據題目所給條件,有以下公式:
x+y=150;x*m1=y*m2;x*m2=32;y*m1=24.5;
第一次寫就是按照題目給的意思,暴力了一回,結果是無腦暴力,沒有結果
獻上失敗代碼:
#include<stdio.h> #include<stdlib.h> int main() { int x,y; double m1,m2; for(x=1;x<=150;x++) for(y=1;y<=150;y++) for(m1=0.1;m1<=2;m1+=0.1) for(m2=0.1;m2<=2;m2+=0.1) { if(x+y==150&&x*m1==y*m2&&x*m2==21&&y+m1==24.5) { printf("x=%d y=%d\n",x,y); } } system("pause"); return 0; }
後來才發現,m1與m2並不是必需的,因為浮點數和整數的運算可能會出現偏差,後來拿筆在紙上畫了一下公式
發現m1和m2是可以消去的,這就省了不少事
已知x*m2=32,y*m1=24.5;那麼m2=32/x,m1=24.5/y;帶入"x*m1=y*m2"式子則有x*x*24.5=32*y*y;
最後綜合上麵所給的式子化出了x、y的對應關係:
x*x*24.5==32*y*y(範圍1到150)
AC代碼:
#include<stdio.h> #include<stdlib.h> int main() { int x,y; double m1,m2; for(x=1;x<=150;x++) { y=150-x; if(x*x*24.5==32*y*y) { printf("x=%d y=%d\n",x,y); } } system("pause"); return 0; }
最後答案:x=80 y=70
最後更新:2017-04-03 12:55:19