通過這一體說說三分的做法。

2021-06-16 21:39:46 字數 3689 閱讀 8186

通過這一體說說三分的做法。

題目列表 > 集會

時間限制: 2000ms 記憶體限制: 256mb

在一條河的一側,分布著 n 個村莊。這些村莊平日裡需要一些**往來,然而商人們來回走遍每一座村莊是非常辛苦的,於是他們決定每個月都在河邊舉行一次集會,大家都來集會上購買需要的物品。然而在集會地點的選擇上,大家卻有分歧,因為誰都不願意集會的地點離自己村莊非常遠。經過一番激烈的討論之後,大家決定要將集會地點挑選在這樣乙個位置:它離最遠的村莊的距離要盡可能的近。

我們把河看做一條足夠長的直線,河岸就是平面座標系上 y = 0 的這條線,y < 0 的區域是河水,而所有村莊都在 y ≥ 0 的區域裡。現在給出所有村莊的平面座標,你要在河岸上找到這樣乙個位置,使得它到所有村莊的最遠距離最小。

輸入檔案包含多組測試資料。

第一行,給出乙個整數 t,為資料組數。接下來依次給出每組測試資料。

每組資料的第一行是乙個整數 n,表示村莊的數量。接下來 n 行,每行有兩個實數 xi 和 yi,表示每乙個村莊的座標。

對於每組測試資料,輸出一行"case #x: y",其中 x 表示測試資料編號,y 表示集會地點的 x 座標值,要求與正確答案的絕對誤差在10-6以內。所有資料按讀入順序從 1 開始編號。

小資料:t ≤ 100, 0 < n ≤ 50, 0 ≤ |xi|, yi ≤ 10000

大資料:t ≤ 10, 0 < n ≤ 50000, 0 ≤ |xi|, yi ≤ 10000

樣例輸入

1

50 8

1 64 4

-5 7

-6 1

樣例輸出

case #1: -1.000000

題外話:

假設函式f(x) =a*x^2+b*x+c

a = 0,b!=0時退化為一條直線,這個時候滿足單調性,我們可以通過二分來做。

當a!=0時,他為一條拋物線,這個時候我們可以用三分來做。

分析:如上圖。

假設最優點為x,往x的左面走到x1,距離會增大,往x的右面走到x2,距離同樣會增大。

由於只有乙個極值點,我們假設區間為[l,r]。

1.找出兩個點x1,x2(上圖不是很準確。。。),這兩個點剛好把[l,r]分成相等的三個部份。

2.判斷f(x1)與f(x2)哪個更優。

如果f(x1)>f(x2),如左圖,則把l = x1

否則,r = x2

3.重複1,2,直到滿足精度。

由於精度不好控制,我們可以直接設定調整的步數,從題目資料我們可以估計出步數的範圍可以假設為100,(2/3)^100次方肯定能夠滿足精度要求了。。。

程式碼如下: ?

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

usingnamespacestd;

typedeflonglongll;

typedefunsignedlonglongull;

#define lx(x) (x<<1)

#define rx(x) (x<<1|1)

#define debug puts("here")

#define rep(i,n) for(int i=0;i#define rep1(i,n) for(int i=1;i<=n;i++)

#define rep(i,a,b) for(int i=a;i<=b;i++)

#define foreach(i,vec) for(unsigned i=0;i#define pb push_back

#define rd(n) scanf("%d",&n)

#define rd2(x,y) scanf("%d%d",&x,&y)

#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define rd4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)

/******** program ********************/

constintmaxn = 50005;

structnodep[maxn];

intn;

doubledis(doublex,doubley)

doublecal(doublenow)

intmain()

doublel = 0,r = 1;

doublepx1,px2;

rep(step,100)

if(px1<0&&fabs(px1)<1e-9)// 判斷是否會出現-0.000000

px1 *= -1.0;

printf("%.6lf\n",px1);

}

return0;

}

大家有空可以做做cf 8d這題,很經典的三分套三分做法。。。

以上~~

三位一體的工業大資料綜述

工業大資料的目的是為了改變以往工業價值鏈從生產端向消費端 上游向下游推動的模式,實現以客戶價值為核心的定製化產品和服務,以及與之相適應的全產業鏈協同優化。為此,工業大資料應滿足使用者需求定義 工業智慧型製造 活動協同優化三方面的應用。在這些應用中,工業大資料的落地需要與之相適應的技術架構作為支撐。目...

作為「整體彙總」的奠基者之「三位一體」

先從兩組並列的三個說起。前面的文章中我給出了兩組由三個並列的東西。第一組是作為 理性 之理的 哲理,道理,原理 的三種變體 第二組是作為 整體彙總 的前行者 臨時備忘 的三門差別 它們為什麼是三個,而且分別是這三個?首先的理由,是在我回答第一篇的第乙個問題中 和 道理 相提並論的 答案就是 哲理 道...

三位一體的漏洞分析方法 web應用安全測試方法

4.1 主動式 全自動 web2.0 互動式漏洞掃瞄 4.2 半自動式漏洞分析 業務重放 url映象,實現高覆蓋度 4.3 被動式漏洞分析 應對0day和孤島頁面 使用常見的漏洞掃瞄器 自動fuzz,填充各種攻擊性資料 業務邏輯混淆,導致服務出錯 侷限 難以處理高互動式應用 只能發現暴露給使用者 搜...