Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- #include <string>
- #include <cctype>
- #include <stack>
- #include <bitset>
- #include <queue>
- #include <list>
- #include <vector>
- #include <map>
- #include <set>
- #include <iterator>
- #include <sstream>
- #include <stdlib.h>
- #include <cmath>
- #define FOR(i,A) for(typeof (A).begin() i = (A).begin() ; i != (A).end() ; i++)
- #define f(i,a,b) for(int i = a ; i < b ; i++)
- #define fd(i,a,b) for(int i = a ; i >= b ; i--)
- #define debug( x ) cout << #x << " = " << x << endl
- #define clr(v,x) memset( v, x , sizeof v )
- #define all(x) (x).begin() , (x).end()
- #define mp make_pair
- #define rall(x) (x).rbegin() , (x).rend()
- #define PI acos( -1.0 )
- #define EPS 1E-4
- #define TAM 100010
- using namespace std;
- typedef pair<int,int> ii ;
- typedef long long ll ;
- typedef long double ld ;
- typedef pair<int,ii> pii ;
- typedef vector <ii> vii;
- typedef vector<int> vi;
- double W,D,A;
- int K;
- double p1[10], q1[10], p2[10], q2[10];
- //la evaluación se hace siguiendo la regla de horner :O
- //he ggeado
- //http://en.wikipedia.org/wiki/Horner%27s_method
- double func(double x, double valor) {
- double num1, den1, num2, den2;
- num1 = num2 = den1 = den2 = 0.0;
- fd(i,K,0) {
- num1 = num1*x + p1[i];
- den1 = den1*x + q1[i];
- num2 = num2*x + p2[i];
- den2 = den2*x + q2[i];
- }
- double integral1, integral2;
- integral1 = num1 / den1;
- integral2 = num2 / den2;
- if (valor > integral1) {
- return 0;
- }
- else if (valor < integral2) {
- return integral1 - integral2;
- }
- else return integral1 - valor;
- }
- int main() {
- while(scanf("%lf %lf %lf %d",&W,&D,&A,&K)!=EOF){
- f(i,0,K+1) {
- scanf("%lf", &p1[i]);
- }
- f(i,0,K+1){
- scanf("%lf", &q1[i]);
- }
- f(i,0,K+1){
- scanf("%lf", &p2[i]);
- }
- f(i,0,K+1){
- scanf("%lf", &q2[i]);
- }
- double x, low, high;
- low = -D; high = 0.0;
- f(i,0,23){//ejecutando, esto da la precisión deseada
- double totA=0.0;
- double x=(low+high)/2.0;
- for (double a=0.0 ; a+EPS-1e-5<W ; a += EPS) {
- double b = a + EPS;
- //regla de simpson
- //http://es.wikipedia.org/wiki/Regla_de_Simpson
- totA += ((b - a) / 6.0) * (func(a, x) + (4 * func((a+b) / 2.0, x)) + func(b, x));
- }
- if (totA< A) {
- high = x;
- }
- else {
- low = x;
- }
- }
- printf("%.5lf\n",(-1)*low);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement