LightOJ – 1043 – Triangle Partitioning

Problem link

আলোচনাঃ

ত্রিভুজ DEF ও ত্রিভুজ ABC হলো সদৃশ। দুইটি সদৃশ ত্রিভুজের ক্ষেত্রে আমরা জানি যে,

1) তাদের প্রতিটি বাহুর অনুপাত পরস্পর সমান হবে এবং পারস্পরিক কোণ গুলোও পরস্পর
সমান হবে।
2)দুইটি সদৃশ ত্রিভুজের ক্ষেত্রফলের অনুপাত হবে তাদের বাহুগুলোর বর্গের অনুপাতের সমান।
প্রথমটার মানে হচ্ছে,
DE/AB = AC/DF = EF/BC
and ∠A=∠D and ∠B=∠E and ∠C=∠F

দ্বিতীয়টার মানে হচ্ছে,
△DEF/△ABC= (DE/AB)^2 = (AC/DF)^2 = (EF/BC)^2

উত্তরঃ
প্রশ্নে দেয়া চিত্র থেকে তাহলে আমরা লিখতে পারি,
AD/AB = AE/AC = DE/BC ———————-(1)
এবং △ADE/△ABC= (AD/AB)^2 = (AE/AC)^2 = (DE/BC)^2 ——————-(2)

From (2) we get,
So, AD = sqrt(△ADE/△ABC)*AB
এখন △ADE ও △ABC এর মান কি করে পাবো?
প্রশ্নে , △ADE / BDEC দেয়া আছে । সুতরাং, BDEC = 1. আর △ABC=△ADE+BDEC
এবং △ADE = △ADE / BDEC

C++ Code:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int main(){
    int t;
    double AB,AC,BC,AD,ADE,ABC,rat;
    scanf("%d",&t);
    for(int i=1;i<=t;i++){

        scanf("%lf%lf%lf%lf",&AB,&AC,&BC,&rat);
        ABC=rat+1;
        AD=sqrt(rat/ABC)*AB;
        printf("Case %d: %.10lf\n",i,AD);
          // Time Complexity : O(1)
    }
}

----------------------------------- OR -------------------------------------
 /**
    In Binary Search approach,
we have to check whether our calculated ratio(ADE/BDEC) is same as given ratio. 

**/

#include <bits/stdc++.h>
using namespace std;

double isRatio(double AB,double AC,double BC,double AD){
  
    double AE,DE,sOfABC,sOfADE,areaOfABC,areaOfADE,areaOfBDEC;
    AE=(AD*AC)/AB;
    DE=(AD*BC)/AB;
    sOfABC=(AB+AC+BC)/2.0;
    sOfADE=(AD+AE+DE)/2.0;
    ///ABC=ADE+BDEC

    areaOfABC=sqrt(sOfABC*(sOfABC-AB)*(sOfABC-BC)*(sOfABC-AC));
    areaOfADE=sqrt(sOfADE*(sOfADE-AD)*(sOfADE-AE)*(sOfADE-DE));
    areaOfBDEC=areaOfABC-areaOfADE;

    return areaOfADE/areaOfBDEC;
}

double binarySearch(double AB,double AC,double BC,double ratio){
    
    double low=0.0,high=AB,AD;
    for(int i=0;i<100;i++){
        double mid=low+(high-low)/2.0;
        AD=mid;
        if(isRatio(AB,AC,BC,AD)>ratio){
          high=mid; 
        }
        else{
          low=mid;
        }
    }
    return AD;
   /** as AD is a double type value that's why we just update 
      high=mid and low=mid. we can't jump by +1 or -1 . we need to check 
      the fraction value too.
   **/
}

int main(){
    double AB,AC,BC,ratio;
    int t;
    cin>>t;
    for(int i=1;i<=t;i++){
        cin>>AB>>AC>>BC>>ratio;
        cout<<fixed<<setprecision(15)<<"Case "<<i<<": "<<binarySearch(AB,AC,BC,ratio)<<"\n";

    }
}

Leave a Reply