OJ 1046 Problem E百钱买百鸡问题
来源:互联网 发布:巨人网络股票 雪球 编辑:程序博客网 时间:2024/06/06 18:48
学校OJ上一道题,卡时间卡的很严,两重循环就Time Limit Exceed ,然后就是推公式,本来想到了一种特殊情况,处理一下后发现WA,删掉后居然AC了,这让我很无语。。。
Description
“百钱买百鸡”是我国著名的古代数学问题,中国古代数学家张丘建在他的《算经》中提出了这样一个问题:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
你的任务是求解下面这个问题。问题是这样描述的:a文钱可买一只公鸡,b文钱可买一只母鸡,c文钱可买d只小鸡。用m文钱买n只鸡,那么有公鸡x只、母鸡y只、小鸡z只。求解出符合题意的x,y,z。
Input
输入为一张表。第一行是一个固定不变的表头,格式见sample。后面有多行,每行为一组测试数据。每组测试数据由6个整数组成,分别为“a,b,c/d,m,n”。满足0<a,b,c,d<=50,50<=m,n<=108+1,并且母鸡和小鸡的单价不会相同。
Output
每组测试数据的运行结果输出为一张表,表头固定为“COCKS,HENS,CHICKS”。每组测试数据的一个可行解数出为一行,为三个整数:“x,y,z”。多组解按照公鸡数从少到多的顺序输出。若测试数据无解则输出“Cannot buy!”。两组测试数据之间用一个空行分隔开。
Sample Input
COCK,HEN,CHICK,MONEY,CHICKS
3,2,1/3,100,100
5,3,1/3,100,100
8,5,1/7,100,100
8,5,1/7,300,300
Sample Output
COCKS,HENS,CHICKS
0,40,60
5,32,63
10,24,66
15,16,69
20,8,72
25,0,75
COCKS,HENS,CHICKS
0,25,75
4,18,78
8,11,81
12,4,84
Cannot buy!
COCKS,HENS,CHICKS
8,40,252
HINT
本题重点在于了解多重循环的运行效率问题,减少一层循环可以降低很大规模的运算量。通过在循环体内加计数器可以统计出循环的运行次数,当测试数据变大时,运行次数的增长会非常可观,这就是超时的原因了。
//这是无删版的,加了想错的地方#include<stdio.h>int main(){ int a, b, c, d, m, n; scanf("COCK,HEN,CHICK,MONEY,CHICKS"); while(scanf("%d,%d,%d/%d,%d,%d", &a, &b, &c, &d, &m, &n) != EOF) { int i, j, k, sign = 0, x, y, z, num, money, count = 0; /*if(a == b) { for(i = 0; i <= n; i++) { x = i; for(j = 0; j <= n - i; j++) { y = j; z = n - x - y; if(z % d == 0 && a * x + b * y + z / d * c == m) { if(!sign) printf("COCKS,HENS,CHICKS\n"); sign = 1; printf("%d,%d,%d\n", x, y, z); } } } } else*/ { for(i = 0; i <= n; i++) { x = i; z = d * (m - b * n - a * x + b * x) / (c - b * d); y = n - x - z; if(x >= 0&& y >= 0&& z>= 0&& a * d * x + b * d * y + c * z == d * m) { if(!sign) printf("COCKS,HENS,CHICKS\n"); sign = 1; printf("%d,%d,%d\n", x, y, z); } }// } if(!sign) printf("Cannot buy!\n"); printf("\n"); }}
//这是精简后的#include<stdio.h>int main(){ int a, b, c, d, m, n; scanf("COCK,HEN,CHICK,MONEY,CHICKS"); while(scanf("%d,%d,%d/%d,%d,%d", &a, &b, &c, &d, &m, &n) != EOF) { int i, x, y, z, sign = 0; { for(i = 0; i <= n; i++) { x = i; z = d * (m - b * n - a * x + b * x) / (c - b * d); y = n - x - z; if(x >= 0&& y >= 0&& z>= 0&& a * d * x + b * d * y + c * z == d * m) { if(!sign) printf("COCKS,HENS,CHICKS\n"); sign = 1; printf("%d,%d,%d\n", x, y, z); } } if(!sign) printf("Cannot buy!\n"); printf("\n"); } }}
- OJ 1046 Problem E百钱买百鸡问题
- YTU-OJ-Problem E: 类的应用
- YTU-OJ-Problem E: AB编程题--世界杯小组赛
- 第十七周 【OJ-问题 E: 重复字符串】
- oj刷题 Problem B: 排序问题
- Problem E
- Problem E
- Problem E
- Problem E
- Problem E
- Problem E
- Problem E
- Problem E
- problem E
- Problem E
- Problem E
- Problem E
- Problem E
- 生活、工作、总结(四)
- DedeCMS自学教程13:织梦CMS站点文档存放路径url优化设置
- candyforkids
- 深圳科陆集团软件开发笔试题
- [leetcode]Pascal's Triangle II
- OJ 1046 Problem E百钱买百鸡问题
- mvc添加数据
- Grid++ Reprot报表自动换行设置
- UIView属性clipsTobounds的应用)
- Libvirt编译安装
- HDU 1815, POJ 2749 Building roads(2-sat)
- dedecms模板设计 > 模板标签语法简介
- 【Android入门常见问题Part2】xxx.xml: Invalid file name: must contain only [a-z0-9_.]
- Windows 下Postgresql的下载与配置