CSP膜你賽 大逃亡

2022-03-17 03:44:23 字數 1782 閱讀 4356

魔王撒旦為了建立魔物的樂土,率領亞多拉瑪雷克、艾謝爾、路西菲爾、以 及馬納果達這四位惡魔大元帥進攻人類世界。然而此時手持聖劍的勇者艾公尺莉亞出現了。

戰敗的魔王逃跑時穿越到了地球,以真奧貞夫的身份過著打工族的生活。最近真奧貞夫手頭有點緊,他接到乙個待遇不錯的任務,但是卻沒有時間。無奈之下,他只能找到可靠的 yxuanwkeith 來幫忙。 然而王導最近忙於籌拍宣傳片,抽不出時間,於是 yxuanwkeith 又找到了你來替他完成這個工作。yxuanwkeith 幫忙的工作是為乙個大賽設計分隊方式。

這個比賽有 n 個人參加,我們可以給這 n 個人分任意數量(不超過n)的隊伍,相同隊伍的人用相同數字來表示。如果有多種表示,我們認為字典序最小的表示才是有效的。

由於組隊的情況實在是太多了,今年大賽組委會決定在比賽的第 i 天採用所有序列中字典序第i小的分隊方式。

現在組委會會向你詢問乙個序列,希望你能告訴他們這個序列的分隊方式會在哪一天被採用。由於答案可能會很大,所以組委會只關心對1000007取模後的結果。

第一行,乙個整數 n 表示參賽人數。

第二行,n 個整數,表示詢問的分隊方式的序列。

一行,乙個整數表示這種方式會在第幾天被採用。答案對 1,000,007 取模。

輸入樣例

31 2 2

輸出樣例4提示

比賽各天的分隊情況如下:第一天:1,1,1第二天:1,1,2第三天:1,2,1第四天:1,2,2第五天:1,2,3

對於100%的資料,n ≤10000,資料保證詢問的數列是乙個有效的序列。

分析先來看一下什麼是合法的序列。

因為字典序最小,所以序列的字首最大值每次最多上公升1(不然就可以將它替換成更小的編號)

然後我們來看如何計算字典序

考慮一下與原序列s有相同字首,但在i位開始與s不同的序列的個數

設s在i位置的數為a[i],字首的最大值為mx

對於在位置i的數大於a[i]的序列,又因為字首相同,所以它們字典序肯定比s大

對於在位置i的數等於a[i]的數列。。。。。。不是說了在i位開始不同的嗎。。直接遞迴到i+1位計算貢獻就好了。

對於在位置i的數小於a[i]的序列,又因為字首相同,所以它們字典序肯定比s小,這些都可以產生貢獻

而這些序列的性質是字首最大值為mx,長度為n-i+1,第i位小於a[i]。

直接設dp式子dp[i][j]表示字首最大值為j,剩下i位的不同方案個數

那麼這些序列的貢獻就是$(a[i]-1)*dp[n-i][mx]$

考慮怎麼求dp式子

那麼每次就有更新最大值與不更新最大值兩種方案

$$dp[i][j]=j \times dp[i-1][j]+dp[i-1][j-1]$$

處理出$n^2$這個陣列然後對原序列一位一位的去計算貢獻$(a[i]-1)*dp[n-i][mx]$就好了

當然也可以直接dp需要的值,即在dp的時候就把(a[i]-1)放進去(這個無法用語言表達,具體看**吧

code

#include#include

using

namespace

std;

const

int maxn=10005

;const

int mod=1e6+7

;int n,mx,nw,f[2

][maxn];

intmain()

int ans=1

;

for(int i=1;i<=n;i++)ans=(ans+f[!nw][i])%mod;

printf(

"%d\n

",ans);

}

膜你賽 ROAD (跑路)

小a的家到公司的路可以看做乙個有向圖,小a家為點1,公司為點n,每條邊長度均為一千公尺。假設小a每秒鐘可以跑2 k千公尺 k是任意數 當然,所以總跑路長度不能超過maxlongint千公尺。問最少需要幾秒才能到公司。資料保證1到n至少有一條路徑。第一行兩個整數n,m,表示點的個數和邊的個數。接下來m...

2018 10 30 膜你賽 火柴

題目 題目描述 p同學總共有k根火柴,分別放在擺成一列的n個火柴盒內,保證k是n的倍數。p同學想要每個火柴盒都有相同數目的火柴,每次他可以從乙個火柴盒中拿一根火柴放到相鄰的火柴盒中。他想知道他最少要移動多少次。輸入輸出格式 輸入格式 第一行乙個整數n,表示火柴盒數。第二行n個整數a 1,a 2,a ...

2018 10 30 膜你賽 咒語

題目 題目描述 亮亮夢到自己來到了魔法城堡,但一扇巨大的石門阻攔了他通向城堡內的路。正當他沮喪之際,突然發現門上有一處機關,機關上有一張很長的紙條。亮亮拿起紙條的一端,只見上面寫著開啟機關的方法 開啟機關需要唸動符咒,咒語是一串長為 l 的由 0 和 1 組成的字串。在這張長紙條上列了 n 個 長為...