您的位置:首页 > 其它

UVA10976摸鱼的暴力枚举初步.....

2018-02-26 12:03 246 查看
https://vjudge.net/problem/UVA-10976

我一开始的想法超时了......
其实想法也还好,里面有两个需要优化的地方.....
(1)通常做法是y<2*k
然后从k开始枚举的..  其实想一下也是,从二倍然后加加加
(2)我 的顺序反了-
完全不需要stack啊....  开两个数组存一下就好了,因为你免不了要输出sum,所以这个存储绕不开的
哪怕是y倒着开始... 或者 是什么的...
(3)暴力枚举....!!!  其实x不用枚举的,只要除法就好了
并且不会有精度损失!!!!!!!因为是int所以除得尽啊 .......多虑了
ac的代码#include<iostream>
#include<stack>
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<iostream>
#include<stack>
using namespace std;

int main()
{
double k;
while (cin >> k)
{
stack<double>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/"<<k<< " = 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/" <<s.top() << endl;
s.pop();
}

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: