二分 假 數論 分數

2021-08-21 07:22:14 字數 1955 閱讀 8182

nput

第一行包含兩個正整數n和p,表示選手的個數以及精度要求。

接下來的n行,每行包含乙個0到100(閉區間)內的整數。

output

輸出乙個實數,取p位有效數字,下取整。

sample input

5 4

100

20 15

10 8

sample output

195.2

data constraint

一共有10個測試點,p的值依次是1到10。

對100%的資料,n≤20

從上方的提示圖可以得知這是乙個下凹的曲線,符合三分性質

但是老子就是不打三分,咋地

設難度為h,區分度為d,每個選手實力為xi,理想分數為ai.

令yi=h-d*xi

分數偏差值f(h,d)可化簡為

f(h,d)=sigma

分別求出f(h,d)關於h和d的導數:

fh』=sigma

fd』=sigma

容易發現fh』,fd』單調遞增.

可以首先二分d,對於確定的d=d』,二分解出fh』=0的零點h』,若fd』<0,令d的下界為d』,否則令d的上界為d』.

自行理解吧,把數學部分去掉還是很容易的(就是考數學好嗎?)

然鵝我沒有學過微積分所以gg咯,看公式好了

#include 

#include

#include

#include

#include

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

const

int n=21;

const

double eps=1e-11;

using

namespace

std;

int n,p;

int a[n];

double x[n];

bool cmp(int a,int b)

int main()

sort(a+1,a+n+1,cmp);

double dl=0.0,dr=2000.0,dmid,hl,hr,hmid;

while (dl+eps0.5;

hl=0.0;hr=2000.0;

while (hl+eps0.5;

double fh=0;

rep(i,1,n)

fh+=x[i]-100.0/(1.0+exp(hmid-dmid*a[i]));

if (fh<0) hl=hmid; else hr=hmid;

}double fd=0;

rep(i,1,n)

fd+=a[i]*(100.0/(1.0+exp(hmid-dmid*a[i]))-x[i]);

if (fd<0) dl=dmid; else dr=dmid;

}double least=0.0;

rep(i,1,n)

least+=(x[i]*log(1.0+exp(hmid-dmid*a[i]))+(100.0-x[i])*log(1.0+exp(dmid*a[i]-hmid)));

char strleast[20]="";

bool b=0;

sprintf(strleast,"%.10lf",least);

int len=strlen(strleast);

rep(i,0,p-1)

printf("%c",strleast[i+b]);

}i--;

if (!b)

while (++i<=len&&strleast[i]!='.')

printf("0");

}

JZOJ5791 階乘 二分 數論,數學

題目 給出nn 個數a 1 a 2 a n a 1 a 2 a n 求a 1 a 2 a n a 1 a 2 a n 是m m 因數的最小的mm。首先,我們可以把這n n個數分解質因數,並將每個質因數存在乙個桶裡。那麼我們設分解後有k 1 k 1 個x 2 x 2 k 2 k 2 個x 2 k m ...

JZOJ5791 階乘 二分 數論,數學

題目 給出nn 個數a 1 a 2 a n a 1 a 2 a n 求a 1 a 2 a n a 1 a 2 a n 是m m 因數的最小的mm。首先,我們可以把這n n個數分解質因數,並將每個質因數存在乙個桶裡。那麼我們設分解後有k 1 k 1 個x 2 x 2 k 2 k 2 個x 2 k m ...

11 1 考試 數論 數論 二分

額,可以直接暴力,或二分,或者像我這麼sb 地分解質因數 因為p是質數,所以a b 1 二分即可 大佬們都用並查集,可是我不會啊 我只會線段樹的解法 複雜度 o nlog 2n 好像比並查集快一點點 哈哈 注意兩種不合法的情況 上面的兩個符合分別是交集,並集的意思 然後二分,直接模擬就好了 incl...