noip模擬賽 時之終末

2022-05-01 09:21:10 字數 4329 閱讀 3366

聖佐治:不用拘泥,剩下的時間已不多……

聖佐治:直呼我的真名——

絲佩碧雅:聖佐治大人

聖佐治:如今,已無法維持結界,或是抑制深淵的前進

聖佐治:既然如此,我將獻上這副身軀,期望最後的戰鬥

聖佐治:已經——應該沒有再和我多需說明的話語了

聖佐治:我也明白,我和其他4人都一樣,是沒有內在的傀儡——只不過是曾經存在的幻影罷了……

聖佐治:我本就是,身體被禁忌之龍的詛咒吞噬殆盡,幾乎半生不死的狀態……

聖佐治:曾經那個被稱作虹之聖佐治的男人已經死了

聖佐治:我除了消滅虛無的碎片,消滅那個魔女以外,已別無他望……

絲佩碧雅:我曾經愛過你,聖佐治大人——

美玲:快走,她由我來擋住!

美玲:你們快去打倒虹之聖佐治和莉澤洛特!

我的脊髓與頭被一分為二——

跌入黑暗的那一剎那——

我,呼喚著,他的名字——

聖佐治……大人……

為了朋友和明天——

我們是同伴……我這樣相信著

因為是同伴……所以相信你……

給你出了一道題:

給你乙個長為n的序列v,你可以從裡面選出最多m個數

有乙個數a,以及b個規則,每個規則即為:

對於這個序列的所有長為a的連續子區間,

如果這個子區間中對應的給出的x個位置都被選中了,

則這次選擇的分數加上y(y可能為負數,這種情況下分數仍然要加上y)

輸入格式:

第一行四個數n,m,a,b

之後一行n個數表示序列v

之後輸入b個規則

每個規則先輸入兩個數x和y,x != 0

之後一行x個數,分別表示這給定的x個位置

輸出格式:

一行乙個數表示最大可能得到的分數

輸入樣例#1:

5 3 3 1

2 3 3 3 3

2 233

1 3

輸出樣例#1:

474
輸入樣例#2:

5 3 3 1

111 222 333 444 555

2 52

1 3

輸出樣例#2:

1384
輸入樣例#3:

6 3 3 2

1 2 3 3 4 1

2 11 2

2 22 3

輸出樣例#3:

16
樣例#4,#5,#6見下發的檔案

【子任務】

子任務會給出部分測試資料的特點。

如果你在解決題目中遇到了困難, 可以嘗試只解決一部分測試資料。

每個測試點的資料規模及特點如下表:

測試點編號

n的範圍  

m的範圍  

a的範圍  

b的範圍

測試點1

n <= 20

m <= 20

a <= 10

b <= 5

測試點2

n <= 20

m <= 20

a <= 10

b <= 5

測試點3

n <= 40

m <= 40

a <= 10

b <= 100000

測試點4

n <= 40

m <= 40

a <= 10

b <= 100000

測試點5

n <= 100

m <= 50

a <= 10

b = 0

測試點6

n <= 100

m <= 50

a <= 10

b = 0

測試點7

n <= 100

m <= 50

a <= 10

b <= 100000

測試點8

n <= 100

m <= 50

a <= 10

b <= 100000

測試點9

n <= 100

m <= 50

a <= 16

b <= 100000

測試點10

n <= 100

m <= 50

a <= 16

b <= 100000

對於100%的資料,n <= 100 , m <= 50 ,a <= 16 , b <= 100000 , 序列中每個值以及每條規則帶來的加分的絕對值 <= 100

【說明】

【樣例1說明】

【樣例2說明】

【樣例3說明】

分析:一開始想著貪心,但是貪不出來.仔細觀察題目就會發現,這其實就是狀壓dp.因為a <= 16,我們可以狀壓a.先預處理出每個狀態的貢獻值.設f[i][j][k]為前i個數中選了j個末尾a個的狀態為k的分數,列舉i-1位置上末尾a個的狀態s,那麼當前如果不考慮第i位的狀態t就是(s << 1) & ((1 << a) - 1).如果第i位不選,那麼f[i][j][t] = max,p是預處理出的每個狀態的貢獻值,如果第i位要選,那麼f[i][j][t | 1] = max

因為i是從i-1轉移過來的,所以可以用滾動陣列優化一下.

#include #include 

#include

#include

using

namespace

std;

int n, m, a, b, v[110], c[(1

<< 16) + 10], p[(1

<< 16) + 10

];int f[55][(1

<< 16) + 10], now, last, ans, g[55][(1

<< 16) + 10

];int

main()

c[stu] +=y;

}for (int i = 0; i < (1

<< a); i++)

for (int j = i; j; j = (j - 1) &i)

p[i] +=c[j];

memset(f, -0x3f, sizeof

(f));

memset(g, -0x3f, sizeof

(g));

f[0][0] = 0

;

int zhuangtai = (1

<< a) - 1

;

for (int i = 1; i <= n; i++, swap(f, g), memset(g, -0x3f, sizeof

(g)))

for (int j = 0; j <= min(m, i); j++)

for (int s = 0; s <= zhuangtai; s++)

if (f[j][s] != -1044266559

)

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

for (int j = 0; j < (1

<< a); j++)

ans =max(ans, f[i][j]);

printf(

"%d\n

", ans);

return0;

}

noip模擬賽 終末

分析 舉個例子就能發現 偶數字上的數都必須是0,奇數字上的數可以取0 k 1,這就是乙個標準的數字dp了.這編譯器.陣列越界了竟然不報錯.include include include include using namespace std typedef long long ll ll n,k,s...

noip模擬賽 密碼

表示沒看懂演算法3 問題描述 有壓迫,就有反抗。mored的寵物在法庭的幫助下終於反抗了。作為乙隻聰明的寵物,他打算把魔法使mored的魔法書盜去,奪取mored的魔法能力。但mored怎麼會讓自己的魔法書輕易地被盜取?mored在魔法書上設定了乙個密碼鎖,密碼鎖上有乙個問題。施以斯臥鋪魔法吧,你有...

NOIP模擬賽 老師

題目描述 一座有n層的教學樓裡有一些學生,第i 0 i n 層有studentsi個學生。你被給定了乙個數k,如果第i層有x個學生,那麼這一層需要 x k 個老師。你可以調整每個學生的樓層,但是每個學生至多只能調整一層,就是說第i層的學生只能去第i 1層 如果有的話 第i層 第i 1層 如果i 1 ...