暑假集訓test6

2021-08-03 20:58:25 字數 4385 閱讀 9883

喜聞樂見,test續集。

來上題。

題目描述

alice 和 bob 有乙個長度為2n的數。現在他們要在這個數字上玩遊戲。他們分別要從 2n 個位中取出 n 個位組成自己的幸運值。每一回合,alice 或 bob 把數字最左邊的那一位拿來放在自己幸運值的最末位。在第 i 輪操作過後,被選取的數字(原數的第i位)會從原數中消失。現在 alice 和 bob 想要使得他們兩個幸運值的和盡可能大。請求出這個值。

輸入格式

第一行乙個整數 n ,意為幸運值的長度。

第二行乙個長度為 2n 的數字,表示原數。

輸出格式

乙個整數為幸運值的和的最大值。

樣例資料

輸入

2 1234

輸出

46備註

【樣例說明】

alice 取 1、2 位。bob 取 3、4 位。幸運值分別為 12 和 34 ,和為 46 。

【資料範圍】

對 30% 的輸入資料 : n≤10;

對 100% 的輸入資料 : n≤18,原數與幸運值均允許字首 0 的存在。

用動歸。

對於乙個人的倒著數第i位對於最終答案的貢獻為a[i]*10^i。

f[i][j]表示alice取了前i位,bob取了前j位的狀態下,ans的最大值。

f[i][j]可以轉移到f[i][j+1]或者f[i+1][j],最終輸出f[n][n]。

如下。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

int n;

long long b[101],v[21],f[21][21],pre[21][21];

char a[101];

int main()

//兩種可能的狀態轉移方程。

if(j!=n&&f[i][j]+v[n-1-j]*(a[i+j+1]-'0')>f[i][j+1])

}cout}

題目描述

給定乙個由數字(0-9)構成的字串 s 。我們可以由此定義出 size(s) * size(s) 大小的矩陣 b ,其中 b[i][j] = s[i] * s[j] ;請問在這個矩陣 b 中,有多少子矩形滿足其中的 b[i][j] 的和為另乙個給定的數字 a 。

輸入格式

第一行乙個整數 a 。

第二行字串 s 。

輸出格式

輸出乙個整數表示滿足條件的子矩形數。

樣例資料

輸入

10 12345

輸出

6備註

【樣例說明】

b矩陣為:

01 02 03 04 05

02 04 06 08 10

03 06 09 12 15

04 08 12 16 20

05 10 15 20 25

和為10的子矩形有:

(1)

01 02 03 04

(2)

01 02

03 04

(3)

04 06

(4)

04 06

(5)

10(6)

10以上共六個。

【資料範圍】

對 10% 的輸入資料 :size(s)≤10 ;

對 30% 的輸入資料 :size(s)≤100 ;

對 100% 的輸入資料 :0≤a≤1000000000,size(s)≤4000 。

由於b[i][j] = s[i] * s[j],則矩陣的第一行和第一列為原序列,且下面所有矩陣的和都是第一行子矩陣的和的倍數,也就是第一行的子矩陣和第一列的子矩陣的乘積。即要列舉出符合提議的矩陣,應先找第一行的數,然後用找符合a/sum[x1…x2](指第一行從x1到x2的和)=sum[y1…y2](指第一列從y1到y2的和)的子矩陣的值分別有多少個,再把兩個數乘起來累加。

但如果a=0,則上述方法不成立,當sum[x1…x2]=0時,sum[y1…y2]可以取任何值。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int n,len;

int a[45000],cnt[45000];

long

long ans;

char s[45000];

int main()

}

else

}cout

0;}

題目描述

給定一張 n 個點的有向帶權完全圖,和乙個陣列 a ,請按順序刪除陣列中的點,請求出在刪除點 a[i] 以前,所有未刪除點對之間的最短路的值的和。

輸入格式

第一行乙個整數 n ,表示點數;

接下來 n 行,每行 n 個數構成鄰接矩陣,描述每條邊的權值,保證 i 號點到 i 號點的權值為 0 ;

最後一行 n 個小於等於 n 的不同的數,描述陣列 a[i]。

輸出格式

輸出 1 行 n 個數,表示答案。

樣例資料

輸入

4 0 3 1 1

6 0 400 1

2 4 0 1

1 1 1 0

4 1 2 3

輸出

17 23 404 0

備註

【資料範圍】

對 30% 的輸入資料 :1≤n≤10 ;

對 100% 的輸入資料 :1≤n≤500;0<權值≤100000 。

如果用最短路的話是會超時的呦,不論是dijkstra還是spfa。

這是考試時血與淚的教訓,一定要記得算時間複雜度和空間複雜度。

當然我們可以換種方式考慮。

把刪點的行為看作是逆向加點,即往裡面不斷加點並更新答案。

可以用floyed的思想。

因為並不是每個點的最短路都會更新,一共只有三種情況。

一是所加點到已加的所有點的路徑的更新。

二是已加的所有點到所加點的路徑的更新。

三是已加點到已加點中途經過所加點的路徑的更新。

如**。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int n;

int f[510][510],a[510];

long

long ans[510];

int main()

for(int j=n;j>i;j--)

for(int k=n;k>i;k--)

f[a[j]][a[k]]=min(f[a[j]][a[k]],f[a[j]][a[i]]+f[a[i]][a[k]]); //所加點為中途的點,第三種情況

for(int j=n;j>=i;j--)

for(int k=n;k>=i;k--)

ans[i]+=f[a[j]][a[k]];

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

cout

<" ";

return

0;}

嗯,就是這樣。

來自2017.7.15

——我認為return 0,是乙個時代的終結。

暑假集訓test7

所以我又回來了,這次是test7。test1,test2,test3,集體失蹤,敬請期待 攤手 嗯,喜大普奔。上題。題目描述 給出乙個由數字 0 9 構成的字串。我們說乙個子串行是好的,如果他的每一位都是 1 8 0 7 並且這四個數字按照這種順序出現,且每個數字都出現至少一次 1118888888...

暑假集訓test14

我會告訴你test13被我吃了嗎?當然不會。哦其實還多吃了一道題。fst是一名可憐的 oier,他很強,但是經常 fst,所以 rating 一直低迷。但是重點在於,他真的很強!他發明了一種奇特的加密方式,這種加密方式只有oier 才能破解。這種加密方式是這樣的 對於乙個 01 串,他會構造另乙個 ...

暑假集訓test 8 28

大概是從我一年以來做過的最 的一套題了。乙個半小時打完三個程式三個暴力拍完以為自己ak了,開心地耍了兩個小時。結果t3要寫高精,ll炸了後4個點,中間還有個點是啥都不選的,我沒用0去更新又炸了乙個點,成功把自己炸成乙個二百五。1.最小生成樹模板題,前天那道題的 弱化 大概期望你去寫個prim但是kr...