本文共 1777 字,大约阅读时间需要 5 分钟。
https://vjudge.net/problem/UVA-10976
我一开始的想法超时了......
其实想法也还好,里面有两个需要优化的地方.....
(1)通常做法是y<2*k
然后从k开始枚举的.. 其实想一下也是,从二倍然后加加加
(2)我 的顺序反了-
完全不需要stack啊.... 开两个数组存一下就好了,因为你免不了要输出sum,所以这个存储绕不开的
哪怕是y倒着开始... 或者 是什么的...
(3)暴力枚举....!!! 其实x不用枚举的,只要除法就好了
并且不会有精度损失!!!!!!!因为是int所以除得尽啊 .......多虑了
ac的代码
#include#include using namespace std;int main(){ int k; while (cin >> k) { int a[1005], b[1005]; int x; int i=0; /// 的确x可以怎么算... 但是y的确是在减小的啊= - // ...从k开始 for (int y = k + 1; y <= 2 * k; y++) {// k+1!!!k是肯定不行的!!!!!!!!!!!!!!!!! if ((k * y) % (y - k) == 0)// 判断条件就是这样了 { x = (k*y) / (y - k); /// 再有.. 傻了 既然x是int那肯定可以除尽啊..... //关键是不用枚举x.... a[i] = x; b[i] = y; i++; } } cout << i<< endl; for (int m= 0; m < i; m++) cout << "1/" << k << " = 1/" << a[m] << " + 1/" << b[m] << endl; } return 0;}///只要枚举y,然后找到符合条件的x就可以了,从顶向下找...../// 而不是,面向数据开始分析... orz/// 从题目中来.. 从题目中枚举.... /////x*(y - k) == k*y;// 倒序输出完全不是问题......但是这个方法似乎复杂了一倍= =// sum完全不是问题... 用数组存一下就好了
然后超时的....
stack别看了吧= =只能说我 从x开始找大概也没错
数学啊,,, 还是多分析了的好
#include#include using namespace std;int main(){ double k; while (cin >> k) { stack s; int cnt = 0; double x = 2 * k, y = 2 * k; while (x <= k*k + k) { for (y = x; y > 0; y--) /// 据说 会有精度损失?= =.... 这是枚举?.... // 多用算法的思想考虑问题..... //要枚举... 而不是自己找...让计算机帮你找,它不怕一个一个一个的找的 { if (x*y == k*x + k*y) { cnt++; s.push(y); s.push(x); //cout <<"1/"< << " = 1/" << x << " + 1/" << y << endl; x += 2;///什么时候有2,什么时候煤油???接班素养!!! continue; } } x += 2; } cout << cnt << endl; while (!s.empty()) { cout << "1/" << k << " = 1/" << s.top(); s.pop(); cout << " + 1/" < << endl; s.pop(); } } return 0;}
转载地址:http://amuti.baihongyu.com/