题意: 给一个测试次数 t 每行输入一个数,输入t行d
0<=t<=3000, 0<=d<=3000
使|(a+b)−a⋅b|≤10−6 and |(a+b)−d|≤10−6
注意:精度用1e-7 及可AC
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int main() { int t; cin>>t; while( t-- ) { double N; cin>>N; double l = 0.0, r = N, mid, eps = 1e-7; int count = 0, flag = 1; while( true ) { mid = ( r + l) / 2.0; double a = N - mid, b = mid; double T = ( a + b ) - ( a * b ); // cout<<"mid = "<<mid<<endl; if( T >= -eps && T <= eps) break; if( T < -eps ){ l = mid; } if( T > eps ) { r = mid; } count++; if(count ==100) { flag = 0; break; } } if(flag) printf("Y %.9lf %.9lf\n",mid,N-mid); else printf("N\n"); } return 0; } //Input //7 //69 //0 //1 //4 //5 //999 //1000 //Output //Y 67.985071301 1.014928699 //Y 0.000000000 0.000000000 //N //Y 2.000000000 2.000000000 //Y 3.618033989 1.381966011 //Y 997.998996990 1.001003010 //Y 998.998997995 1.001002005