hdu 5954 -- Do not pour out(積分+二分)

来源:http://www.cnblogs.com/chen9510/archive/2017/10/07/7635679.html
-Advertisement-
Play Games

題目鏈接 Problem Description You have got a cylindrical cup. Its bottom diameter is 2 units and its height is 2 units as well.The height of liquid level i ...


題目鏈接

 

Problem Description You have got a cylindrical cup. Its bottom diameter is 2 units and its height is 2 units as well.
The height of liquid level in the cup is d (0 ≤ d ≤ 2). When you incline the cup to the maximal angle such that the liquid inside has not been poured out, what is the area of the surface of the liquid?   

 

Input The first line is the number of test cases. For each test case, a line contains a float-point number d.  

 

Output For each test case, output a line containing the area of the surface rounded to 5 decimal places.  

 

Sample Input 4 0 1 2 0.424413182  

 

Sample Output 0.00000 4.44288 3.14159 3.51241     題意:現在有一個圓柱形的水杯,底面直徑為2,水杯高為2,現在水杯中裝有高為d的水,求將水杯傾斜到最大角度(即水到杯口時,水不能流出)時,水面的面積?   思路:由高中學過的幾何知識可以知道:水面相當於對於一個很長的圓柱體傾斜的用刀切開,那麼這個切麵就是一個完整的橢圓,當然如果不傾斜則得到特殊的橢圓——圓,如果水面經過杯底,那麼水面就是一個缺少一部分的橢圓,所以我們需要分開討論水面經過杯底和不經過杯底兩種情況。           那麼這兩種情況的d的臨界值是多少呢? 可以發現對於水剛到杯底的時候,有水和無水的部分各占一半,所以分界點d=1;   1、水面不經過杯底(d>=1)                這種情況如上圖所示,h+(2-h)/2=d, 所以h=2*d-2,那麼可以求出水面這個完整橢圓的長半徑a=sqrt(2*2+(2-h)*(2-h))/2,而橢圓的短半經是b=1,所以水面面積為S=PI*a*b.   2、水面經過杯底(d<1)                   上圖即是水面經過杯底的樣子(我畫的不是水杯傾斜,直接讓水傾斜了,湊合看吧)。                    對於上圖中mid越大則水的體積越大,那麼我們可以根據體積二分mid求出mid真實長,最後根據真實的mid求出水面的面積,可以知道二分範圍為(0,2)。每次我們需要根據當前mid求出水的體積,因為水體不規則所以必須積分求水的體積。            積分:我們根據水的高度積分,如上圖所示利用 y 積分求體積,那麼我們需要根據 y 求出每個水體截面的長 t (類似於杯底的mid),求相似三角形 t/mid=(2-y)/2 得 t=(2-y)*mid/2 ;   然後根據水截面長 t 求出當前水體截面的面積 S;            可以知道水體截面為一個扇形減去一個三角形組成,面積及體積如下圖所示:          

         

         求出真實的mid以後,那麼就可以求出水面的面積了。

         

       如上圖所示利用二分求出的mid得 len=sqrt(2*2+mid*mid),設水面與杯底的一個交點為(x,h),h=sqrt(1-(1-mid)*(1-mid)) (由杯底水面交線所在圓很容易求出 h ),那麼len=a-x  且x^2/a^a+h^2/b^2=1 ,解上面兩個方程 求得a= a=len/(1+(flag表示正負)flag*sqrt(1-h*h)),x=a-len  可以發現mid<1時水面為小半個橢圓,這時x>0,所以flag<0,反之mid>1時,水面為大半個橢圓,這時x<0,flag>0 。

      現在橢圓方程已求出,X範圍(x,a)(不是完整的橢圓),所以需要積分,如下圖所述:

     

       面積終於求出來了,太驚喜了!

       那麼現在就該上代碼了:

 

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
const double PI=acos(-1);
const double eps=1e-12;

double cal2(double x)
{
    double sum=x+sin(2*x)/2;
    return sum;
}
double area(double a,double x)
{
    double sum=cal2(0.5*PI);
    sum=sum-cal2(asin(x/a));
    return sum*a;
}
double cal(double x)
{
    double ans=sin(x)-sin(x)*sin(x)*sin(x)/3-x*cos(x);
    return ans;
}
double getV(double mid)
{
    double V=cal(acos(1))-cal(acos(1-mid));
    V=V*(-2)/mid;
    return V;
}

int main()
{
    int T; cin>>T;
    while(T--)
    {
        double d; scanf("%lf",&d);
        if(d>1)
        {
            double h=2*d-2;
            double a=sqrt(4+(2-h)*(2-h))/2;
            printf("%.5f\n",PI*a);
            continue;
        }
        double l=0.0,r=2.0;
        for(int i=0;i<50;i++)
        {
            double mid=(l+r)/2;
            //double du=acos(1-mid);
            //double S=du-sin(du)*(1-mid);
            double V=getV(mid);
            if(fabs(V-PI*d)<eps) break;
            if(V>PI*d) r=mid;
            else l=mid;
        }
        double mid=l;
        if(mid==0.0) mid=eps;
        int flag=1;
        if(mid<1) flag=-1;
        double len=sqrt(mid*mid+4);
        double h=sqrt(1-(1-mid)*(1-mid));
        double a=len/(1+flag*sqrt(1-h*h));
        double x=a-len;
        double res=area(a,x);
        printf("%.5f\n",res);
    }
    return 0;
}

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • php有哪幾種錯誤提示 1.notice : 註意 2.waring : 警告 3.error : 錯誤 PHP中都有哪幾種查錯方法? 1、語法檢查--php配置文件里,把錯誤顯示選項都打開或者代碼開始部分,加error_reporting(E_ALL)2、邏輯檢查--設置斷點,在斷點前寫日誌 er ...
  • 大學畢業後筆者進入一家外企,做企業CRM系統開發,那時候開發效率最高的高級程式語言,毫無疑問是C#。恰逢公司也在擴張,招聘了不少.net程式員,筆者作為應屆生,也樂呵呵的加入到.net程式員行列中。 C#.net非常容易上手,之前在大學里,做過winform和webform開發,也曾經在老師那裡承接 ...
  • Too Rich Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 1410 Accepted Submission(s): 362 Probl ...
  • SpringBoot引入JPA,application.ymlapplication.yml增加資料庫鏈接參數,啟動卡死,日誌沒有動,如下圖 折騰好久,後面發現用 Maven的package 過程中 可以看出資料庫名稱出錯,如下圖 這時候再啟動,發現控制台日誌也有了看出資料庫名稱出錯。 最後實驗下, ...
  • 最近需要做一個粗略的後臺管理的許可權,根據用戶的等級來載入相應的菜單,控制到子菜單。使用的是Easyui這個框架。 1.我使用的mysql資料庫。在這裡我就建立四張表,角色表(tb_users),菜單表(tb_menu),用戶許可權表(tb_role),許可權菜單表(tb_user_role).表結構如下 ...
  • 在 java平臺上,lombok 提供了簡單的註解的形式來幫助我們消除一些必須有但看起來很臃腫的代碼, 比如屬性的get/set,及對象的toString等方法,特別是相對於 POJO。簡單的說,就是簡化了Java代碼,消除Java冗長的代碼。lombok jar的下載地址:https://proj ...
  • 把泛型由Boolean改為String。 ...
  • RBAC --> 基於角色的許可權控制 tb_user tb_role tb_userrole tb_menu(增、刪、改、查) tb_rolemenu 1 說明 給出三個頁面:index.jsp、user.jsp、admin.jsp。 index.jsp:誰都可以訪問,沒有限制; user.jsp: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...