2018 07 08 2018提高組 模擬C組

2021-08-21 07:23:17 字數 4372 閱讀 7747

fj準備教他的奶牛彈奏一首歌曲,歌曲由n(1<=n<=50,000)種音節組成,編號為1到n,而且一定按照從1到n的順序進行彈奏,第i種音節持續b_i(1<=b_i<=10,000)個節拍,節拍從0開始計數,因此從節拍0到節拍b_1-1彈奏的是第1種音節,從b_1到b_1+b_2-1彈奏的是第2種音節,依此類推。

最近奶牛對彈琴不感興趣了,他們感覺太枯燥了。所以為了保持奶牛們注意力集中,fj提出q(1<=q<=50,000)個問題,問題的格式都是「第t次節拍彈奏的是哪種音節」

每個問題對應乙個t_i(0<=t_i<=節拍總數-1)請你幫奶牛來解決。

字首和+二分

或排序問題離線做

#include 

#include

using

namespace

std;

int n,q,b[50004];

int find(int k)

return ans;

}int main()

for (int i=1;i<=q;i++)

}

農夫約翰的奶牛們遊戲成癮!本來fj是想要按照陶叫獸的做法拿她們去電擊戒癮的,可是後來他發現奶牛們玩遊戲之後比原先產更多的奶。很明顯,這是因為滿足的牛會產更多的奶。

但是,奶牛們在哪個才是最好的遊戲平台這個問題上產生了巨大的分歧。乙隻奶牛想要買一台xbox 360來跑《光暈3》;另外乙隻奶牛想要一台任天堂wii來跑《任天堂明星大亂鬥x》;第三隻奶牛想要在playstation 3上面玩《潛龍諜影4》,順便還能看某些高畫質的日本電影。

fj想要在給定的預算內購入一些遊戲平台和一些遊戲,使他的奶牛們生產最多的奶牛以養育最多的孩子。

fj研究了n(1 <= n <= 50)種遊戲平台,每一種遊戲平台的**是p_i(1 <= p_i <= 1000),並且每一種遊戲平台有g_i(1 <= g_i <= 10)個只能在這種平台上執行的遊戲。很明顯,奶牛必須先買進一種遊戲平台,才能買進在這種遊戲平台上執行的遊戲。每乙個遊戲有乙個遊戲的**gp_j(1 <= gp_j ** <= 100)並且有乙個產出值pv_j(1 <= pv_j<= 1000000),表示乙隻牛在玩這個遊戲之後會產出多少牛奶。

最後,農夫約翰的預算為v(1 <= v <= 100000),即他最多可以花費的金錢。請幫助他確定應該買什麼遊戲平台和遊戲,使得他能夠獲得的產出值的和最大。

考慮下面的資料,有n種遊戲平台,並且有v=800預算。第一種遊戲平台花費300並且有兩個遊戲,**分別為30和25,它們的產出值如下所示:

遊戲 # 花費 產出值

1 30 50

2 25 80

第二種平台**為600,並且只有一種遊戲:

遊戲 # 花費 產出值

1 50 130

第三種平台**為400,並且有三種遊戲:

遊戲 # 花費 產出值

1 40 70

2 30 40

3 35 60

農夫約翰應該買第1和第3種平台,並且買平台1的遊戲2,還有平台3的遊戲1和遊戲3。使得

他最後的產出值最大,為210:

產出值

預算: 800

平台 1 -300

遊戲 2 -25 80

平台 3 -400

遊戲 1 -40 70

遊戲 3 -35 60

總計: 0 (>= 0) 210

一眼看出是動態規劃,但是不會轉移······涼涼

emmm······

f[i]表示花費為i時的最大產出值

對於每個遊戲平台,開乙個陣列ff記錄上次的f[i],ff[i]=f[i-p]

然後對於該遊戲平台內的遊戲,ff[i]=max(ff[i-a)(有『–』的東西都要倒著來)

然後用ff[i]更新f[i]

#include 

#include

#include

#include

using

namespace

std;

int n,k,ans;

int f[100005],f2[100005];

int main()

}for (int l=p;l<=k;l++)

if (f2[l]>f[l]) f[l]=f2[l];

}printf("%d",f[k]);

}

奶牛們發現,在農場裡面賽跑是很有趣的一件事。可是她們一旦在農場裡面不斷地轉圈,就會變得頭暈目眩。眾所周知,眩暈的奶牛是無法產奶的。於是,農夫約翰想要把他農場裡面的雙向道路全部改為單向道路,使得他的農場裡面乙個「圈」都沒有,以避免他的奶牛們被搞得暈頭轉向。如果奶牛可以經過若干條道路回到起點,那麼這些道路就稱為乙個「圈」。

農場有n(1 <= n <= 100000)片草地,編號為1到n。這些草地由m1(1 <= m1 <= 100000)條單向道路和m2(1 <= m2 <= 100000)條雙向道路連線起來。任何一條道路都不會把一片草地和這篇草地本身連線起來。但是,任意兩片草地之間都可能有多條道路連線。不保證任意兩片草地之間都有路徑相連。

你的任務是給所有的雙向道路設定乙個方向,使得整個農場(只剩下單向道路)最後乙個圈都沒有。也就是說,不存在乙個單向道路序列的終點和起點重合。資料保證一開始就有的單向道路中,乙個圈都沒有。而且一開始就有的單向道路不能改變。

單向道路的起點是草地a_i(1 <= a_i <= n),終點是草地b_i(1 <= b_i <= n)。雙向道路連線草地x_i(1 <= x_i <= n)和y_i(1 <= y_i <= n)。

根據單向邊拓補排序後,雙向邊中順序小的點連向順序大的點即可

#include 

using namespace std;

const int n=1000006;

int n,m1,m2,cnt;

int ls[n],ne[n],to[n],r[n],a[n],b[n];

int main()

cnt=0;

for (cnt;cntfor (int i=1;i<=n;i++)

if (r[i]==0&&!b[i])

}for (int i=1;i<=m2;i++)

}

跟所有人一樣,農夫約翰以著寧教我負天下牛,休叫天下牛負我的偉大精神,日日夜夜苦思生財之道。為了發財,他設定了一系列的規章制度,使得任何乙隻奶牛在農場中的道路行走,都要向農夫約翰上交過路費。

農場中由n(1 <= n <= 250)片草地(標號為1到n),並且有m(1 <= m <= 10000)條雙向道路連線草地a_j和b_j(1 <= a_j <= n; 1 <= b_j <= n)。奶牛們從任意一片草地出發可以抵達任意一片的草地。fj已經在連線a_j和b_j的雙向道路上設定乙個過路費l_j(1 <= l_j <= 100,000)。

可能有多條道路連線相同的兩片草地,但是不存在一條道路連線一片草地和這片草地本身。最值得慶幸的是,奶牛從任意一篇草地出發,經過一系列的路徑,總是可以抵達其它的任意一片草地。

除了貪得無厭,叫獸都不知道該說什麼好。fj竟然在每片草地上面也設定了乙個過路費c_i(1 <= c_i <= 100000)。從一片草地到另外一片草地的費用,是經過的所有道路的過路費之和,加上經過的所有的草地(包括起點和終點)的過路費的最大值。

任勞任怨的牛們希望去調查一下她們應該選擇那一條路徑。她們要你寫乙個程式,接受k(1<= k <= 10,000)個問題並且輸出每個詢問對應的最小花費。第i個問題包含兩個數字s_i和t_i(1 <= s_i <= n; 1 <= t_i <= n; s_i != t_i),表示起點和終點的草地。

因為有多個詢問,因此放棄單源做多源

floyed加強版,要在計算邊權同時計算點權

點權進行排序,可以保證最終得出最大點權

要將排序後的點權與原來的點對應可以採取記錄每個點對應的點,這樣在讀入和輸出呼叫點時可以找到要找的點的位置

#include 

#include

#include

using

namespace

std;

int n,m,k,q,f[260][260],a[260][260],b[260];

struct nodec[260];

bool comp(node a,node b)

sort(c+1,c+1+n,comp);

for (int i=1;i<=n;i++) b[c[i].o]=i;

for (int i=1;i<=m;i++)

for (int t=1;t<=n;t++)

for (int i=1;i<=n;i++)

for (int j=1;j<=n;j++)

for (int i=1;i<=k;i++)

return

0;}

提高組(計數)

題目鏈結 類題 氣泡排序 求長度為 n 的排列中滿足最長下降子串行長度不超過 2 且符合 p x y 的排列數。n le 10 7,t le 10 6 題意轉化 不存在三個點,使得左邊的點比中間大,右邊的點比中間小。我們要知道乙個 trick 從大到小 從小到大列舉數,嘗試將其插入當前排列,並使之合...

NOIP提高組 矩陣

在麥克雷的面前出現了乙個有n m個格仔的矩陣,每個格仔用 或 表示,表示這個格仔可以放東西,則表示這個格仔不能放東西。現在他拿著一條1 2大小的木棒,好奇的他想知道對於一些子矩陣,有多少種放木棒的方案。因為棍子是1 2的,所以很容易就能發現,兩個被分割的塊,除了跨越兩個塊擺放木棍的方案數會對答案有影...

提高組測試賽

資料範圍 解析 tiny counting 樣例 限制與約定 解析 medium counting 2.1.2019.11.4 2.2019.11.3 令人頹唐,第一題沒開long long,丟80分 好在犯錯跳舞唱歌是在15號開始 第二題理應暴力分,第三題理應不會 我算不出來 給定兩個長度為n n...