>description
螞蟻山上有t(1<=t<=1,000)種螞蟻,標記為1…t,每種螞蟻有n_i只螞蟻(1<=n_i<=100),現有a(a<=5000)只螞蟻,從中選出s,s+1,…,b(1<=s<=b<=a)只螞蟻一共有多少種選法?
如有5只螞蟻分別為,一共有3種螞蟻,每一種螞蟻的數量分別為2,2,1,以下是選不同數量螞蟻的方法:
1個螞蟻3種選法:
2個螞蟻5種選法:
3個螞蟻5種選法:
4個螞蟻3種選法:
5個螞蟻1種選法:
你的任務是從中選s…b只螞蟻的方法總和。
>input
第一行: 4個空格隔開的整數: t, a, s和b;
第2到a+1行:每行乙個整數表示螞蟻的種類。
>output
輸出從a只螞蟻中選出s…b只螞蟻的方法數,答案保留後6位。
對於30%的資料:t<=30,a<=100;
對於50%的資料:t<=100,a<=400;
對於100%的資料:t<=1000,a<=5000;
>解題思路
一道dp題
設f [i
][j]
f[i][j]
f[i][j
]為前i
ii種螞蟻選j
jj只的總方案
我們只需預處理乙個桶,記錄第i
ii種螞蟻的總數
很容易得出狀態轉移方程:
f [i
][j]
=σf[
i−1]
[j−(
0t[i
])
]f[i][j]=σf[i-1][j-(0 ~ t[i])]
f[i][j
]=σf
[i−1
][j−
(0t[
i])]
(默默列舉第i種螞蟻選多少只,因為答案求的只是組合數)
我們又會發現這是乙個熟悉的字首和優化,所以我們再預處理一下字首和就可以了(雖然我沒有預處理字首和就過了,不過我還是打了一下字首和)
>**
#include
#include
#include
#define p 1000000
#define n
5005
using namespace std;
int t, n, a, b, s[
1005
], f[
1005][
n], sum[
1005][
n], ans;
int main()
}printf
("%d"
,(p + sum[t]
[b]- sum[t]
[a -1]
)% p)
;return0;
}
懶螞蟻精神
今天讀到一篇文章,是關於懶螞蟻的,文章是這樣說的 什麼是懶螞蟻呢?在成群的螞蟻中,大部分螞蟻都是在爭先恐後地尋找食物 搬運食物的,可以說是相當勤勞。但有少數螞蟻則整日東看看,西望望,似乎無所事事,什麼活也不幹,它們就是懶螞蟻。那麼這些懶螞蟻在螞蟻隊伍中有什麼作用呢?科學家們做了下面的實驗 他們在這些...
螞蟻的故事
老婆生活記錄 螞蟻是地球上最常見的昆蟲,數量最多的昆蟲種類。螞蟻好小,只有幾公釐,乙隻螞蟻的重量只有 0.005 克,很多動畫片裡都有它的身影,百威啤酒的廣告也讓小小螞蟻變成了最可愛的小東西,對這樣的乙個小可愛,你會怕它嗎?今天,閒暇之餘對幾個朋友做了乙個小小的調查,問他們是否怕螞蟻?片刻,朋友們的...
螞蟻問題(演算法)
有一根27厘公尺的細木桿,在第3厘公尺 7厘公尺 11厘公尺 17厘公尺 23厘公尺這五個位置上各有乙隻螞蟻。木桿很細,不能同時通過乙隻螞蟻。開始時,螞蟻的頭朝左還是朝右是任意的,它們只會朝前走或調頭,但不會後退。當任意兩隻螞蟻碰頭時,兩隻螞蟻會同時調頭朝反方向走。假設螞蟻們每秒鐘可以走一厘公尺的距...