jzoj NOIP2014提高組模擬8 9總結

2021-06-23 04:25:39 字數 4779 閱讀 7570

一、最大配對給出2

個序列a=,b=

,從a、b

中各選出

k個元素進行一一配對(可以不按照原來在序列中的順序),並使得所有配對元素差的絕對值之和最大。

例如各選出了

a[p[1]]

,a[p[2]],……

,a[p[k]]

與b[q[1]]

,b[q[2]],……

,b[q[k]]

,其中p

序列中的元素兩兩不相同,

q序列中的元素兩兩不相同,那麼答案為

|a[p[1]]

-b[q[1]]|

+|a[p[2]]

-b[q[2]]|+……

+|a[p[k]]

-b[q[k]]|

,現在任務也就是最大化這個答案。

可證得:要想配對數間差的絕對值之和最大,一定是最大值與最小值配對。

所以可以先排序,但由於最大值、最小值均可出自a、b序列中,且不可同時出自同一序列,互不影響,所以可以貪心一下,最後求和輸出。

一般第一題都是比較簡單的搜尋、找規律或貪心題,而貪心一般建立在找規律上才可確保它沒有後效性,此次第一題很多人說不出為什麼貪心沒有後效性,就大膽猜測,然而往往不是這麼容易矇對這種「顯然」,故可以先從規律入手。(雖然我也是大膽猜測……)

二、旅行

(做這道題時莫名想起上次被師弟們虐的情景)

今天又是個神聖的日子,因為

lhx教主又要進行一段長途旅行。但是教主畢竟是教主,他喜歡走自己的路,讓別人目瞪口呆。為什麼呢,因為這條路線高低不平,而且是相當的嚴重。

但是教主有自己的辦法,他會魔法。

這段路可以用乙個長度為

n的序列

a[i]

來表示,

a[i]

表示了第

i這段路的高度。畢竟教主即使會使用魔法他還是個人,教主如果想穿越這條路線,他必須從第

1段路開始走,走到第

n段,從第

i段走到第

i+1段路需要消耗

|a[i+1]-a[i]|

點體力。為了節省體力,教主使出了他另一種神奇的魔法。教主的魔法可以交換相鄰兩段路的高度,並且這種魔法不需要花費額外的體力。但是第二次使用魔法開始,交換的兩段路在路線中的位置需位於之前交換的兩段路之後。即如果某次交換了

a[j]

和a[j+1]

,那麼下次交換

a[k]

和a[k+1]

必須滿足j<

k。接著,lhx

教主想規劃下如何調整路段高度後穿越,使得體力消耗最小。

通常遇到這類可通過修改,形成多方案求最優,且修改沒有後效性的題目,都可以用dp打

dp有順推和逆推,可根據具體情況分析,眾人表示逆推程式設計難度低,而在此我僅說明順推的思路(一開始就這麼打,只是很難說明構思,努力說明……)

首先定義f[i][j][k](1<i<n,j為傳遞過來的山的高度,k=0或1,表示當前山是否已經和後面的山交換,i可以用滾動陣列,故空間完全沒問題),我們確定前i座山的方案,後面的位置不變,分不操作和i+1與i+2交換後,用f[i]推f[i+1],可以得出的是,無論當前山是否交換,都可以確定第i座山和第i+1座山的其中一座高度為a[i+1],而由於可能有從前面傳遞過來乙個無法得知的高度,這時候j就派上用場了。

分四中情況:

1、k=0 i+1與i+2不交換,則高度依次為:j、a[i+1]、a[i+2]把傳遞高度改為a[i+1]

2、k=0 i+1與i+2交換,則高度依次為:j、a[i+2]、a[i+1]傳遞高度為a[i+1]

3、k=1 i+1與i+2不交換,則高度依次為:a[i+1]、j、a[i+2]傳遞高度為j

4、k=1 i+1與i+2交換,則高度依次為:a[i+1]、a[i+2]、j 傳遞高度為j

知道具體高度後就可以直接推了(注:對於i=1時傳遞高度為a[i])最後再取最優值。

由於直接列舉j會達到n*maxa[i]的複雜度,所以可以用記憶化+迴圈佇列優化時間複雜度為方案數。(具體可參照**:

#include

#include

#include

#include

using

namespace

std;

int n,sum,l,r;

int f[2][100001][2],bz[100001],d[10000],a[2001];

void did(int x)return;

int min(int x,int y) if(f[x][d[l]][1]!=0)

printf("%d",ans-1);

return

0; 這種順推是無意間出現在腦中的,很難表述,但很多時候這類因人而異的思維模式會有助於個人的**,所以believe yourself,一開始我是只得了50points,但後面堅信自己的思路,就改出來了。

附錄:還有一種沒打過的貪心搜尋思路共享一下:其實可以發現,一段路的代價就是相鄰波峰、波谷極值差的絕對值之和,而屬於有效(即優化了方案)的交換,就是將某個峰頂交換到一座比它高的山里(或谷底交換到比他低的谷裡),由於是只能單向交換,那麼前面的山交換過的區間裡的山就不能交換,只會對該山產生影響(如圖:

兩次的方案代價為藍色高度和

三、資源勘探

教主要帶領一群

orzer

到乙個雄奇地方勘察資源。

這個地方可以用乙個

n×m的矩陣

a[i, j]

來描述,而教主所在的位置則是位於矩陣的第1行第

1列。矩陣的每乙個元素

a[i, j]

均為乙個不超過

n×m的正整數,描述了位於這個位置資源的型別為第

a[i,j]

類。教主準備選擇乙個子矩陣作為勘察的範圍,矩陣的左上角即為教主所在的

(1, 1)

。若某類資源

k在教主勘察的範圍內恰好出現一次。或者說若教主選擇了

(x,y)即第x

行第y列作為子矩陣的右下角,那麼在這個子矩陣中只有乙個

a[i,j]

(1≤i≤x

,1≤j≤y

)滿足a[i, j]=k

,那麼第

k類資源則被教主認為是稀有資源。

現在問題是,對於所有的

(x, y)

,詢問若

(x, y)

作為子矩陣的右下角,會有多少類不同的資源被教主認為是稀有資源。

一開始時著實沒有好方法,我從點入手,看他向左向上覆蓋的區間內的數出現乙個的有多少(暴力一枚)(n^4)

然後我們可以發現某行答案與上行答案不同時,是因為該行出現了限制點,那麼就可以出現以線入手,按行加入答案(n^3)

其實我們可以把答案分布圖畫出來,就可發現答案是以限制點作分割線,成塊狀分布的:

(舉例出現一次1的,答案為紅色區)

2 2 1 5 6 5

2 32 4 2 3

2 3 4 2 1 3

3 1 5 2 4 5

12 5 3 5 7

2 1 2 5 3 4

而且從沒有覆蓋的1,可看出起限制作用的點(一行一行推的話)是該行包括以前最偏左的兩個1,只有乙個1時,右限制為最後一列,反之為已列舉的1裡最小和次小的縱座標,答案就夾在裡面,形成縱座標區間,當然,這樣還是按行加入的「暴力」,關鍵在於塊狀分布,因而可以再記錄上一次出現的橫座標,與當前列舉出現該數的行形成橫座標區間,加上縱座標區間,就可形成乙個塊狀的答案區,然後o(1)加入答案,時間複雜度為o(n^2),注意:有的數字可能在最後一行沒列出,其與最後一行形成的答案區會沒記上,所以要在輸出前將其答案補上。

四、排列統計

對於給定的乙個長度為

n的序列

,問有多少個序列

對於所有的

i滿足:

a[1]

~a[i]這i

個數字中有恰好

b[i]

個數字小等於

i。其中為1

~n的乙個排列,即1~

n這n個數字在序列

a[i]

中恰好出現一次。

資料保證了至少有乙個排列滿足

b序列。

看到這題,著實沒啥想法,但看到網上神轉換,著實驚呆了:

設定乙個矩陣f

若我們將橫座標x表示位置,縱座標y表示數值,用1和0表示是否有數,若f(x1,y1)=1,則表示第x1個數為y1,由於1~n只能出現一次,每個位置只能出現乙個數,所以同行同列只能出現乙個1。

這時我們來看看b的定義,為位置小於等於i,數值小於等於i的數個數限制,若裝換到f中,則為b[i]=sig(f(x,y)(0因而我們可以矩陣f(1~i-1,1~i-1)方案確定的情況下來確定f(1~i,i)和f(i,1~i-1)的方案,然後用乘法原理來進行合併,可看作乙個反向的l。如圖:

01?

1 0 ?

???然後分三種情況:b[i]-b[i-1]=0,則該「l」中不放1,方案數不變; b[i]-b[i-1]=1,則要在該「l」中放1個1,由於橫座標、縱座標分別已佔了b[i-1]個位置,可用位置為((i-b[i-1])*2-1) b[i]-b[i-1]=2,則要在該「l」中放2個1,則(i,i)上不能為1,則兩個1分別可放(i-b[i-1]-1)個位置,方案為(i-b[i-1]-1)^2。(注:我們不必確定具體位置,只需確定可行位置數,我們可看成不用的在後面會填上(∵在n*n的矩陣裡放n個1,每行每列必定有乙個1),也可看成只要確定了有可行位置,那麼必定會組合成乙個合法解)

由此可見,對數值、位置、大小、等級、順序建立緯度,可形成乙個n維模型,更直觀體現要求,也更容易求解(即便解題方案沒什麼差別,但擁有乙個良好的思維構圖,能讓人在抽象的條件下,找到直觀的立足點,以便更好解題)

NOIp提高組2014 解方程

求方程 sum a ix i 0 在 1,m 內的整數解 1 leq a i leq 10 a i neq 0,1 leq n leq 100,1 leq m 10 6 最樸素的做法就是嘗試所有解,判斷左邊多項式值是否為零 但還有乙個高精問題 如果你真要用高精我也不攔你 可以考慮一種類雜湊做法,如果...

NOIP提高組2014 解方程

題面 解方程 思路 首先你會發現資料非常毒瘤,a i 10 最開始以為要寫高精度,等了要完模板之後 沒錯我這麼辣雞怎麼會高精 才發現,根本用不著23333 因為其 n 比較小,可以考慮 hash 的思想,把 a i 都 乙個大質數,就避免了高精度,具體實現就是在讀入的時候 inline ll rea...

noip2014 提高組題解 equation

題目大意 給定高次方程an x n a1 x 1 a0 0 求 1,m 區間內有多少個整數根 ai 10 10000,m 1000000,n 100 首先,在考試的時候由於我很弱,一看到ai的範圍我就傻了,果斷30分騙起 解題思路 1.30分 30分很好騙,直接暴力就行了 2.60分 因為我考試的時...