友好的生物

2022-05-11 07:38:31 字數 2494 閱讀 7372

【問題描述】

w 星球是乙個和地球一樣氣候適宜、物種聚集的星球。經過多年的研究,外星生物學

家們已經發現了數萬種生物,而且這個數字還在不斷增大。

w 星球上的生物很有趣,有些生物之間很友好,朝夕相伴,形影不離;但有些卻很敵

對,一見面就難免發生戰鬥。為了能夠更好地了解它們之間的友好程度,外星生物學家希望

進行一些量化的計算。他們發現,兩種生物之間的友好程度和它們的 k 種屬性有關,暫且將

它們編號為屬性 1、屬性 2、......、屬性 k,這些屬性都是可以進行量化的。外星生物學家

研究發現,如果前 k-1 種屬性的差別越大,這兩種生物就越友好;但是屬性 k 與眾不同,這

種屬性差別越小的兩種生物越友好。

因此他們猜想是不是可以用這樣乙個公式量化兩種生物之間的友好程度:

,其中 ci 是非負常數。如果

知道了每種生物的各種屬性,利用上述公式就很容易算出它們之間的友好程度了。現在,外

星生物學家們想問一問:在目前發現的這些生物當中,關係最友好的那對生物是哪一對呢?

它們之間的友好程度是多少?

【輸入檔案】

輸入檔案的第一行是兩個整數 n 和 k,分別表示目前發現的生物種數和屬性的種數。

第二行有 k 個非負整數 ci,即計算友好程度時所需的常數。

接下來的 n 行,描述每種生物,按照先後順序依次編號為生物 1、生物 2、......、生物 n。

每一行都有 k 個整數,給出該種生物的各項屬性值,按照先後順序依次編號為屬性 1、屬性

2、......、屬性 k。

【輸出檔案】

輸出檔案包含一行,為乙個整數,表示最友好的生物之間的友好程度。

【約定】

2 ≤ n ≤ 100,000

2 ≤ k ≤ 5

0 ≤ ci ≤ 100。

每種生物的各項屬性值不小於-10000 且不大於 10000

最大的友好程度一定大於 0

【樣例輸入】

5 31 2 3

-5 3 2

-2 3 0

0 5 9

3 4 -1

-10 -11 7

【樣例輸出】

36對於|a-b|,只有兩種情況

a-b       (a>b)

-a+b     (a<=b)

對於兩個動物i,j   k=4

可以寫成(a[i][1]-a[i][2]+a[i][3]-a[i][4])-(a[j][1]-a[j][2]+a[j][3]-a[j][4])

以上是滿足(a[i][1]>a[j][1],a[i][2]a[j][3],a[i][4]>a[j][4])時的式子

現在唯一有問題就是兩兩之間大小關係不確定

其實發現可以忽略大小關係,去看符號關係(比如上面就是+-+-)

以上面(i,j)舉例,如果用它去對應兩種符號關係,那麼肯定是正確的最大

因為不正確的符號關係肯定會有一項小於0,所以會比正確的小

於是我們用搜尋構出所有符號關係o(2^k),再用這個關係去o(nk)求乙個最大值

令f[i]=(a[i][1]?a[i][2]?a[i][3]?a[i][4]?a[i][5])

那麼最大值就是max(f[1~i-1]-f[i])

因為第k位是特殊的,這裡特殊處理(也是因為再列舉第k位會超時):

符號直接賦為+

事先將動物按第k屬性從小到大排序

這樣就滿足條件了

1 #include2 #include3 #include4 #include5

using

namespace

std;

6struct

fff7

a[100001

];10

int n,k,b[6],ans,c[6

];11

bool

cmp(fff a,fff b)

1215

void

check()

16 28}29

void dfs(int

x)30

37 b[x]=1;dfs(x+1

);38 b[x]=-1;dfs(x+1

);39}40

intmain()

41 50 sort(a+1,a+n+1

,cmp);

51 dfs(1

);52 cout<

53 }

友好的生物(狀壓dp)

傳送門 戳還有集訓隊寫的的題解 大概思路 1.把c j 乘入屬性中。乘完後求的即是 2.對於前k 1個屬性和第k個屬性分別討論,即 3.列舉符號串行,最優的情況一定包含在之內 4.把生物按照第k個屬性的大小排序,保證了後面的數第k種屬性大於前面的,這樣減出來第k個屬性的差值一定是負值,滿足條件。in...

WC2005 友好的生物

這題算是毒瘤吧,看到這個題我除了o n 2 想不到別的方法 後來嘗試使用平方的方式亂搞,但是給出了反例 在看了國家集訓隊ysy的解題報告後方才明白 思路是一種放寬的思路 我們列舉每個差值的符號,在其中列舉最大值,就可以有效去除絕對值 最後按照第k位從小到大排序,來列舉 從小到大進行掃瞄,每次用當前的...

BZOJ 5068 友好的生物 放縮

猜到複雜度 卻依然不會做 這個方法感覺和不等式證明中的放縮法有點類似,所以我個人這樣稱呼 先把c ic i ci 乘進去,把式子寫出來 i 1k 1 ai bi ak bk sum a i b i a k b k i 1 k 1 a i b i ak bk 絕對值很煩,考慮怎麼去掉它,我們可以直接2...