猪的安家
来源:互联网 发布: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
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不相等。
- 猪的安家
- 猪的安家ACM
- 猪的安家问题
- 猪的安家
- 猪的安家
- fzu 猪的安家
- FOJ 1402 猪的安家
- FZU 1402 猪的安家
- 最小公倍数求解猪的安家
- fzu 1402 猪的安家
- 安家的开始
- 安家的开始
- 安家
- 安家
- 安家
- 安家!
- 安家~
- 安家
- Hive权限控制中间层-Hamza
- 乱删rpm导致再次安装包时出现 error while loading shared libraries: libgcc_s.so.1问题
- 谈谈网络编程(基于C++)
- LeetCode9——Palindrome Number
- Ubuntu12.04安装vim7.3
- 猪的安家
- 机器学习,我们需要注意什么
- 未来云计算必然打造强大的需求市场
- HTTP协议
- 图解GPS原理 为什么需要4颗卫星才能定位,而不是3颗
- C#调用C++DLL时的编码转换
- 1588 - Kickdown
- vi编辑器
- oracle trunc()函数用法-1