1. 程式人生 > >題解:NOI2016國王飲水記

題解:NOI2016國王飲水記

慶祝通過noip2018初賽,系列五題EP2.

題目描述

跳蚤國有 n 個城市,偉大的跳蚤國王居住在跳蚤國首都中,即 1號城市中。

跳蚤國最大的問題就是飲水問題,由於首都中居住的跳蚤實在太多,跳蚤國王又體恤地將分配給他的水也給跳蚤國居民飲用,這導致跳蚤國王也經常喝不上水。

於是,跳蚤國在每個城市都修建了一個圓柱形水箱,這些水箱完全相同且足夠高。一個雨天后,第 i個城市收集到了高度為 hi 的水。由於地理和天氣因素的影響,任何兩個不同城市收集到的水高度互不相同。

跳蚤國王也請來螞蟻工匠幫忙,建立了一個龐大的地下連通系統。跳蚤國王每次使用地下連通系統時,可以指定任意多的城市,將這些城市的水箱用地下連通系統連線起來足夠長的時間之後,再將地下連通系統關閉。由連通器原理,這些城市的水箱中的水在這次操作後會到達同一高度,並且這一高度等於指定的各水箱高度的平均值。

由於地下連通系統的複雜性,跳蚤國王至多隻能使用 k次地下連通系統。跳蚤國王請你告訴他,首都 1號城市水箱中的水位最高能有多高?

輸入輸出格式

輸入格式:

 

輸入的第一行包含 3個正整數 n,k,p,分別表示跳蚤國中城市的數量,跳蚤國王能使用地下連通系統的最多次數,以及你輸出的答案要求的精度。p 的含義將在輸出格式中解釋。

接下來一行包含 n個正整數,描述城市的水箱在雨後的水位。其中第 i 個 正整數 hi表示第 i 個城市的水箱的水位。保證 hi 互不相同,1\le h_i \le10^51hi105。

 

輸出格式:

 

輸出僅一行一個實數,表示 1 號城市的水箱中的最高水位。

這個實數只可以包含非負整數部分、小數點和小數部分。其中非負整數部分為必需部分,不加正負號。若有小數部分,則非負整數部分與小數部分之間以一個小數點隔開。若無小數部分,則不加小數點。

你輸出的實數在小數點後不能超過 2p 位,建議保留至少 p位。資料保證參考答案與真實答案的絕對誤差小於 10^{-2p}102p。

你的輸出被判定為正確當且僅當你的輸出與參考答案的絕對誤差小於 $10^{−p}$。此外,每個測試點你將有可能獲得部分分。

如果你的輸出與參考答案的絕對誤差不小於 10^{-p}10p 但小於 10^{-5}105,你可以獲得該測試點 40% 的分數。

 

輸入輸出樣例

輸入樣例#1:  複製
3 1 3
1 4 3
輸出樣例#1:  複製
2.666667

說明

由於至多使用一次地下連通系統,有以下 5 種方案:

  1. 不使用地下連通系統:此時 1 號城市的水箱水位為 1。

  2. 使用一次連通系統,連通 1、2 號:此時 11 號城市的水箱水位為 5/2。

  3. 使用一次連通系統,連通 1、3 號:此時 1 號城市的水箱水位為 2/2。

  4. 使用一次連通系統,連通 2、3號:此時 1 號城市的水箱水位為 1。

  5. 使用一次連通系統,連通 1、2、3號:此時 11 號城市的水箱水位為 8/3。

為保證答案精度,我們一般需要儘可能地在運算過程中保留超過 p位小數。我們可以證明,在各個子任務的參考演算法中都能保證,在任何時候始終保留 6/5p位小數時,對任何輸入得到的輸出,與參考答案的絕對誤差都小於 10^−p。

為了方便選手處理高精度小數,我們提供了定點高精度小數類。選手可以根據自己的需要參考與使用該類,也可以不使用該類。其具體的使用方法請參考下發的文件 decimal.pdf。

解題思路:

經過一系列推導之後可以發現這就是一個dp+斜率優化,但是高精度小數需要使用他給的板子(於是程式碼長度就超過了上一篇冰雪小屋)

 

(慶祝通過noip2018提高組初賽的第二題)

 

下面上程式碼:

  1#include<bits/stdc++.h>
2#define N 8005  
3using namespace std;
4int a[N],sum[N],pre[N][20],q[N*2];
5double dp[N][20];
6int n,k,p,st,lim,kk,l,r;
7double x;
8
9
10// ---------- decimal lib start ----------
11
12const int PREC = 3332;
13
14class Decimal {
15    public:
16        Decimal();
17        Decimal(const std::string &s);
18        Decimal(const char *s);
19        Decimal(int x);
20        Decimal(long long x);
21        Decimal(double x);
22
23        bool is_zero() const;
24
25        // p (p > 0) is the number of digits after the decimal point
26        std::string to_string(int p) const;
27        double to_double() const;
28
29        friend Decimal operator + (const Decimal &a, const Decimal &b);
30        friend Decimal operator + (const Decimal &a, int x);
31        friend Decimal operator + (int x, const Decimal &a);
32        friend Decimal operator + (const Decimal &a, long long x);
33        friend Decimal operator + (long long x, const Decimal &a);
34        friend Decimal operator + (const Decimal &a, double x);
35        friend Decimal operator + (double x, const Decimal &a);
36
37        friend Decimal operator - (const Decimal &a, const Decimal &b);
38        friend Decimal operator - (const Decimal &a, int x);
39        friend Decimal operator - (int x, const Decimal &a);
40        friend Decimal operator - (const Decimal &a, long long x);
41        friend Decimal operator - (long long x, const Decimal &a);
42        friend Decimal operator - (const Decimal &a, double x);
43        friend Decimal operator - (double x, const Decimal &a);
44
45        friend Decimal operator * (const Decimal &a, int x);
46        friend Decimal operator * (int x, const Decimal &a);
47
48        friend Decimal operator / (const Decimal &a, int x);
49
50        friend bool operator < (const Decimal &a, const Decimal &b);
51        friend bool operator > (const Decimal &a, const Decimal &b);
52        friend bool operator <= (const Decimal &a, const Decimal &b);
53        friend bool operator >= (const Decimal &a, const Decimal &b);
54        friend bool operator == (const Decimal &a, const Decimal &b);
55        friend bool operator != (const Decimal &a, const Decimal &b);
56
57        Decimal & operator += (int x);
58        Decimal & operator += (long long x);
59        Decimal & operator += (double x);
60        Decimal & operator += (const Decimal &b);
61
62        Decimal & operator -= (int x);
63        Decimal & operator -= (long long x);
64        Decimal & operator -= (double x);
65        Decimal & operator -= (const Decimal &b);
66
67        Decimal & operator *= (int x);
68
69        Decimal & operator /= (int x);
70
71        friend Decimal operator - (const Decimal &a);
72
73        // These can't be called
74        friend Decimal operator * (const Decimal &a, double x);
75        friend Decimal operator * (double x, const Decimal &a);
76        friend Decimal operator / (const Decimal &a, double x);
77        Decimal & operator *= (double x);
78        Decimal & operator /= (double x);
79
80    private:
81        static const int len = PREC / 9 + 1;
82        static const int mo = 1000000000;
83
84        static void append_to_string(std::string &s, long long x);
85
86        bool is_neg;
87        long long integer;
88        int data[len];
89
90        void init_zero();
91        void init(const char *s);
92};
93
94Decimal::Decimal() {
95    this->init_zero();
96}
97
98Decimal::Decimal(const char *s) {
99    this->init(s);
100}
101
102Decimal::Decimal(const std::string &s) {
103    this->init(s.c_str());
104}
105
106Decimal::Decimal(int x) {
107    this->init_zero();
108

相關推薦

題解NOI2016國王飲水

慶祝通過noip2018初賽,系列五題EP2. 題目描述 跳蚤國有 n 個城市,偉大的跳蚤國王居住在跳蚤國首都中,即 1號城市中。 跳蚤國最大的問題就是飲水問題,由於首都中居住的跳蚤實在太多,跳蚤國王又體恤地將分配給他的水也給跳蚤國居民飲用,這導致跳蚤國王也經常喝不上水。 於是,跳蚤國在每個城市都修建

BZOJ4654 NOI2016國王飲水(動態規劃+三分)

  有很多比較顯然的性質。首先每個城市(除1外)至多被連通一次,否則沒有意義。其次將城市按水位從大到小排序後,用以連通的城市集合是一段字首,並且不應存在比1城市還小的。然後如果確定了選取的城市集合,每次選擇也應該是連續的一段,且應從小到大選,這樣保證了將其他城市的水儘量分到1,而不是被另外的城市分流。同時也說

【BZOJ4654】【NOI2016國王飲水(動態規劃,斜率優化)

code 奇怪 while lib show ima double 優化 .com 【BZOJ4654】【NOI2016】國王飲水記(動態規劃,斜率優化) 題面 BZOJ 洛谷 題解 首先肯定是找性質。 明確一點,比\(h_1\)小的沒有任何意義。 所以我們按照\(h\)排

LOJ#2087 國王飲水

-s closed isp tdi end return mil 單獨 ... 解:這個題一臉不可做... 比1小的怎麽辦啊,好像沒用,扔了吧。 先看部分分,n = 2簡單,我會分類討論!n = 4簡單,我會搜索!n = 10,我會剪枝! k = 1怎麽辦,好像選

Gym 100733J Summer Wars 題解靈活運用掃描線的思想

ace ng- 最大值 掃描線 例如 main post 集合 i++ 題意: 給你n個點,m個橫著的線段。你能夠橫移這些線段,可是這些線段的相對位置不能改變。假設一個點,在它的正上方和和正下方都有線段(包含線段的終點)。則這個點被視為被“屏蔽”。問通過隨意平移我們

閱讀文獻存在的問題坐不住,不住,想不開

enc 自己 dia wiki href 成功 產生 做成 不同 引用:http://blog.sciencenet.cn/blog-2068-500206.html 文獻閱讀是科研的重要基礎,但是並非每一個科研人員都喜歡和擅長看文獻——例如

題解 P2799 【國王的魔鏡】

cpp highlight 行存儲 數組名 strlen pos 簡單 log div 題解 P2799 【國王的魔鏡】 本蒟蒻在剛開始做這題時第一反應就是遞歸,題目不難,但我提交了n次才過。 下面粘代碼,我的代碼冗長,但思路非常明確。 #include<bits/

題解bzoj1801: [Ahoi2009]chess 中國象棋

bits 題解 display num 兩個 lld ber 組合 i++ Description 在N行M列的棋盤上,放若幹個炮可以是0個,使得沒有任何一個炮可以攻擊另一個炮。 請問有多少種放置方法,中國像棋中炮的行走方式大家應該很清楚吧. Input 一行包含兩個整數N

題解UVa1025 A Spy in the Metro

cit %d mat png a10 direct 發現 TP 最小 原題鏈接 pdf 題目大意 給出一張無向圖圖,求該圖的最小瓶頸生成樹。 無向圖的瓶頸生成樹:無向圖\(G\)的一顆瓶頸生成樹是這樣的一顆生成樹:它最大的邊權值在\(G\)的所有生成樹中是最小的。瓶頸生成樹

[BZOJ 3157] 國王奇遇

linear oos 加強 com ase scan mes turn code Link: BZOJ 3157 傳送門 Solution: 題意:求解$\sum_{i=1}^n m^i \cdot {i^m}$ $O(m^2)$做法: 定義一個函數$f[i]$,$f[

題解中位數

www. 單調遞增 pro namespace target space IT UC 基於 傳送門 首先考慮的是二叉搜索樹,每次查找當前排名(i+1)/2的數。但是對於某些數據,其遞歸層數過多,會導致爆棧。 那麽顯然可以用Treap或Splay。 這裏考慮線段樹

題解[ZJOI2014]璀燦光華

找到 距離 坐標 回溯 turn 編號 最短路 ges 方法 原題鏈接 題目描述 金先生有一個女朋友沒名字。她勤勞勇敢、智慧善良。金先生很喜歡她。為此,金先生用\(a^3\)塊\(1 \times 1 \times 1\)的獨特的水晶制作了一個邊長為\(a\)的水晶立方體,

題解NOI2016序列

hellip 最大化 min 多次 else truct code name bool   Two - pointer 第一題…… 大概就是對於一段連續的區間求解,使用兩個指針不斷卡區間的長度直到區間不滿足條件吧。   這題只要對區間以長度從小

題解HNOI2002 營業額統計

工作 flow keyword nbsp 管理 soft min pad nco 題目描述 Tiger最近被公司升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。 Tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營

題解CF115E(線段樹優化dp)

定義 可能 bit tput space nbsp sans odi bsp 題目描述 你是一個賽車比賽的組織者,想在線性王國中安排一些比賽。 線性王國有n條連續的從左到右的道路。道路從左到右依次編號為從1到n,因此道路按照升序排列。在這些道路上可能會有幾場比賽,每一場

題解子矩陣(NOIP2014普及組T4)

+= out bsp tdi 又是 style 預處理 sizeof 表示 又是dp 暴力枚舉會T 考慮先固定一個變量,比如先枚舉行 然後預處理每行之間的絕對值,每列之間的絕對值 然後dp進行轉移 註意記錄選擇的行數 轉移記得加上新選的列的行之間的絕對值,即w[

題解[SCOI2011]糖果

依舊是比較明顯的差分約束 注意對於五種操作分別對應的連邊方式 然後注意head的初始值判斷,要不然總是超時……今天遇到好幾次了 建圖時加個小剪枝,否則會TLE 1 #include<iostream> 2 #include<cstdio> 3 #include&

題解UVA10298 Power Strings

求解每個字串的最短迴圈子串 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=1000005; int p[maxn]; c

題解車站分級(2013普及組)

這道題可以暴力可以拓撲排序 甚至還可以差分約束???? 原諒我一開始沒看出來可以差分約束 這是暴力做法 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using nam

題解[SDOI2008]燒水問題

思維題 其實就是找個規律 其實類似於貪心,把一杯水的熱量儘量全部傳遞, 一步一步往後退可得到需要加熱的為         t(n+1)/t(n)=1-1/2n   1 #include<iostream> 2 #include<cstdio> 3 #inclu