HDU 3809 Decrypt coordinate(坐标解密)

题目大意:

x1 = x – sqrt(y)
y1 = y – sqrt(x)

题目给出多个x1,y1.求出x,y。如果有多种可能的话,就输出x较小的那一对x,y。

思路:一开始我还以为是纯几何。囧。。后来只好偷看答案了,迭代!神了,因为有2个方程,2个未知数,但是因为不是齐次方程,所以解起来麻烦。

怎么迭代呢?

因为 x= x1+ sqrt(y)

        y = y1 + sqrt(x),先把x1,y1存下来之后,把x1,y1当成x,y进行运算,那么得到的x,y肯定是小于真实值的,但是把它累加在保存下来的x1,y1后,之后再把得到的

x,y当成x,y,进行运算,迭代会把累加,逼近x,y的真实值。一句话就是:增加的越来越少的样子,然后像渐近线一样逼近真实值。

program:

#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
int main()
{
int test;
scanf("%d",&test);
double x1,y1;
int cas=1;
while(test--)
{
  scanf("%lf%lf",&x1,&y1);
  double x,y;
  double sx=x1,sy=y1;
  do
   {
       x=x1,y=y1;
       x1=sx+sqrt(y);    

       y1=sy+sqrt(x);
                  
   }while(x1-x>0.00000001||y1-y>0.00000001);

//其实 X2<X1<X,(Xi都是代入来迭代的东西,虽然在减小,但是还是在累加,所以一直在逼近)

// 两个不满足才跳出 ,

//刚开始时都是大于小数点为5个数的数,但是题目要求输出6个小数,所以要相差度到至少7个小数点才退出循环,

//循环装的都是反条件,都是不良条件,都是直到良好条件停止循环,输出好的,最终要求的东西


   printf("Case %d: %.6lf %.6lf\n",cas++,x1,y1);//注意啊,lf不能掉啊            
}
//system("pause");
return 0;}

 


 

总结:(一针见血):然后一开始把y=y1,x=x1赋值上去迭代,因为x>x1,y>y1;所以这样迭代上去,值会累加。可是为什么累加后值不会超过真实的x与y呢。。。

因为x=x1+sqrt(y1+sqrt(x1));这里面y1+sqrt(x)本来就是小于真实的y的。所以这里迭代上去只能使值越来越靠近真实值,而不会出现迭代上去后,值超过真实值的情况。。

括号里面的内容一直在迭代的时候就像递推式一样的变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值