猪的安家

来源:互联网 发布:mac化妆品是几线品牌 编辑:程序博客网 时间:2024/04/30 14:28

题目描述:

Andy和Mary养了很多猪。他们想要给猪安家。但是Andy没有足够的猪圈,很多猪只能够在一个猪圈安家。举个例子,假如有16头猪,Andy建了3个猪圈,为了保证公平,剩下1头猪就没有地方安家了。Mary生气了,骂Andy没有脑子,并让他重新建立猪圈。这回Andy建造了5个猪圈,但是仍然有1头猪没有地方去,然后Andy又建造了7个猪圈,但是还有2头没有地方去。Andy都快疯了。你对这个事情感兴趣起来,你想通过Andy建造猪圈的过程,知道Andy家至少养了多少头猪。  输入  

输入包含多组测试数据。每组数据第一行包含一个整数n (n <= 10) – Andy建立猪圈的次数,解下来n行,每行两个整数ai, bi( bi <= ai <= 1000), 表示Andy建立了ai个猪圈,有bi头猪没有去处。你可以假定(ai, aj) = 1.  输出  

输出包含一个正整数,即为Andy家至少养猪的数目。 

样例输入  

3 1 

5 1 

7 2  

样例输出  

16

 

题目分析:

设有c满足所有等式c = ai*x + bi则要选取出最小的c,其中x是一个整数。

 

解题思路:

当然有很多的解法,比如矩阵解方程或者c从1开始穷举出第一个满足所有等式的c。我们可以考虑第二种方法,但是没必要从1开始穷举,从max{ai}开始,设max{ai}的情况下,一个猪圈里养x=0只猪开始,然后得出c后,用c依次校验前面的所有式子,如果得出其他式子的x也都是一个整数,则满足,否则max{ai}的x+1,继续按照上述规则循环校验。


#include <algorithm>//线性等式ax+b=y//这里xy都为离散变量class LinearEquation{private:int a;int b;public:LinearEquation() :a(0), b(0){}LinearEquation(int a, int b) :a(a), b(b){}int GetY(int x)const{return a*x + b;}bool IsRightY(int y)const{//是否是正确的y,在x不为整数时认为y不正确return ((y - b) % a) == 0;}bool operator > (const LinearEquation &f) const{return a > f.a;}};int GetPigNumber(int eNumber,LinearEquation *arr){//eNumber为给出的等式的数量,arr为存储给出等式的集合std::sort(arr, arr + eNumber, [](const LinearEquation &l1, const LinearEquation &l2){return l1 > l2; });//按线性等式中的a的大小来排序int perPigpenNumber = 0;//每个猪圈养的猪的数量int pigNumber = 0;//猪的数量while (1){//循环开始寻找多少只猪能满足所有等式bool isARightY = true;//假设是正确的ypigNumber = arr[0].GetY(perPigpenNumber++);std::for_each(arr, arr + eNumber, [&](const LinearEquation &f){if (!f.IsRightY(pigNumber)){//如果有一个等式不满足条件isARightY = false;return;}});if (isARightY)//所有Y得出的X都是整数return pigNumber;}}void InputBuildingPigpen(){int num = 0;if (scanf_s("%d", &num) == EOF || !num)//如果输入的num为0就退出return;LinearEquation *pigPen = new LinearEquation[num];for (int i = 0; i < num; ++i){int a = 0, b = 0;scanf_s("%d%d", &a, &b);pigPen[i] = LinearEquation(a,b);}printf("猪的数量为:%d\n", GetPigNumber(num, pigPen));delete[] pigPen;}int _tmain(int argc, _TCHAR* argv[]){InputBuildingPigpen();return 0;}


本代码有个问题就是没有对输入数据做错误校验,其实做错误校验也不难,只需要校验给出的两个等式会不会出现矛盾就行了,矛盾的条件是aj是ai的倍数,但是bj和bi不相等。

0 0
原创粉丝点击