Wednesday, August 30, 2017

10784 Diagonal Uva Problem Solution & Full Logic

https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=1725

খুবই সহজ একটা সমস্যা , যদি তুমি বিষয়টি ধরতে পারো - তাহলে । চলো , তাহলে শুরু করি --------
আমরা একটা জিনিস জানি -- সেটা হলো , যদি  N  বাহু  বিশিষ্ট  কোনো  ক্ষেত্র থাকে , তাহলে , সেখানে  
কর্ণ থাকবে  N*( N - 3 ) / 2 টি ।।   বিশ্বাস না হলে , চলো - চতুর্ভুজ দিয়ে চেক করে দেখি - চতুর্ভুজ এর বাহু মোট 4 টি , সুত্র অনুযায়ী কর্ণ হবে -   4*( 4 - 3 ) / 2 = 2 টি ।। আশা করি , সুত্র নিয়ে কিছুটা স্বস্তি অনুভব হচ্ছে , তাই না ??

এবার আসি , আসল কথায় --- তোমাকে ঠিক উলটো কাজ'টি করতে হবে  ।   তোমায় , একটা ভুজের কর্ণ এর সংখ্যাই দেয়া থাকবে , তোমায় বের করতে হবে , সেই ভুজের কমপক্ষে বাহু কয়টা আছে ?? এর মানে --  N  এর মান বের করতে হবে।  তাহলে , ধরে নিলাম - দেয়া কর্ণ এর সংখ্যা  C টি । তাহলে , আমরা কি - কোনো সমীকরণে দাড় করাতে পারি - বিষয়টি ?? চলো , দেখা যাক ----

                                       ( N*( N - 3 )) / 2 = C

                                    => (  N * (  N  - 3 ) )  = 2*C

                                   =>  N^2 - 3*N = 2*C
                                 
                                  =>  N^2 - 3*N - 2*C =0

  এখন  দেখো তো , উপরের সমীকরণ'টি  Ax^2 + Bx + C =0  এর মতো লাগছে না ?? হুম , আশা করি বুঝতে পেরেছো যে - কি করতে যাচ্ছি ??? তো চলো , এখন আমরা সুত্র অনুযায়ী এর সমাধান বের করি ।

 আমরা জানি , ( -B + ( sqrt ( B^2 - 4*A*C ) ) /2*A  হলো , Ax^2 + Bx + C =0 সমীকরণের সমাধান   । শুধু মাত্র , ধনাত্বক নিলাম , কারণ - বাহু কখনো ঋণাত্বক হয় না ।।  যাই হোক , আমরা সুত্র অনুযায়ী ,
                       N^2 - 3*N - 2*C =0    সমীকরণের সমাধান করে - ফেলতে হবে , তাহলেই আমরা
   চলক   N   এর  মান  পেয়ে  যাবো  ,  অর্থাৎ আমাদের কাংক্ষিত উত্তরখানা পেয়ে যাবো ।। 

 তাহলে , এর মান হবে  " 3 + sqrt(9+8*n))/2 "   [ সুত্র অনুযায়ী ,( -B + ( sqrt ( B^2 - 4*A*C ) ) /2*A তে     N^2 - 3*N - 2*C সমীকরণের সহগগুলো বসিয়ে পাওয়া ]    ।।

তো চলো , এবার কোড দেখে ফেলি -----------------------------

 #include<bits/stdc++.h>



using namespace std;



int main()
{
    int i;
   double n,p;
for(i=1;scanf("%lf",&n) && n;i++){
    p = ceil((3+sqrt(9+8*n))/2);
printf("Case %d: %.0lf\n",i,p);

}
    return 0;
}
























     

No comments:

Post a Comment