2017 3 10校內訓練

2022-09-18 01:54:28 字數 3272 閱讀 4823

hzwer又在虐人 照常acm賽制 ac:5/7

b.複雜的整數劃分問題

題目大意:將正整數n表示成一系列正整數之和,n=n1+n2+…+nk,其中n1>=n2>=…>=nk>=1,k>=1。正整數n的這種表示稱為正整數n的劃分。多組詢問,每次給出n和k,要求回答:n劃分成k個正整數之和的劃分數目,n劃分成若干個不同正整數之和的劃分數目,n劃分成若干個奇正整數之和的劃分數目。(0思路:先n^3隨便dp一下即可o(1)回答詢問(應該有複雜度更低的做法,不過畢竟這題n比較小)。問題1:f[i][j][k]表示和為i,分出j個,最大不超過k的方案數;問題2:f[i][j]表示和為i,最大為j的方案數,問題3同問題2。轉移方程比較容易……

#include#define mn 50

int f1[mn+5][mn+5][mn+5],f2[mn+5][mn+5],f3[mn+5][mn+5

];int

main()

c.棋盤分割

題目大意:給定乙個8*8的數字矩陣,每次可以從大矩陣切一刀切成兩個小矩陣,選擇其中乙個小矩陣繼續切,最後分成n個小矩陣,用xi表示第i個小矩陣內的元素和,要求最小化xi的均方差。(均方差:令xi的平均數為x,均方差=((xi-x)^2/n)^0.5)(n<15)

思路:由於n給定,題目所求即最小化(xi-x)^2,事實上我們發現,xi之和即為整個矩陣的和,也就是說,給定n後,平均數x是個定值,我們預處理出二維字首和即可知道每個子矩陣對答案的貢獻,用f[p][i][j][k][l]表示用p個子矩形拼成以(i,j)為左上角,(k,l)為右下角的矩形,直接dp就可以了,複雜度o(n*8^5)。

#include#include

#include

using

namespace

std;

double f[15][10][10][10][10

];int a[10][10

];inline

double sqr(double x)

intmain()

b=(double)a[8][8]/n;

for(p=1;p<=n;++p)for(i=0;i<10;++i)for(j=0;j<10;++j)

for(k=0;k<10;++k)for(l=0;l<10;++l)f[p][i][j][k][l]=0x7fffffff

;

for(i=1;i<=8;++i)for(j=1;j<=8;++j)for(k=i;k<=8;++k)for(l=j;l<=8;++l)

f[1][i][j][k][l]=sqr(a[k][l]-a[i-1][l]-a[k][j-1]+a[i-1][j-1]-b);

for(p=2;p<=n;++p)for(i=1;i<=8;++i)for(j=1;j<=8;++j)for(k=i;k<=8;++k)for(l=j;l<=8;++l)

printf(

"%.3lf

",sqrt(f[n][1][1][8][8]/n));

}

d.roads

題目大意:給定一張n個點m條邊的有向圖,邊有長度和費用,求從點1走到點n,費用不超過k的最短路。(n<=100,m<=10000,k<=10000,0<=邊費用<=100,1<=邊長<=100)

思路:觀察發現邊長和費用的範圍都比較小,考慮dp,由於邊的費用可能為0不好處理,我們用邊長表示狀態來dp,f[i][j]表示走到點j共走了i的最小花費,直接dp即可。

#include#include

#include

using

namespace

std;

inline

intread()

#define mn 100

#define ml 10000

#define me 10000

#define inf 1000000000

int h[mn+5],rh[mn+5],en,f[ml+5][mn+5],q[mn+5],qn,u[mn+5

];struct edgee[me*2+5

];inline

void ins(int*h,int x,int y,int w,int c);h[x]=en;}

intmain()

e.a decorative fence

題目大意:求字典序第k大的滿足a1a2,a4a2,a3a3……的1~n排列。(n<=20,多組詢問)

思路:dp求出f[i][j]表示1~i的排列,第1個為j,滿足其中乙個性質的方案數,滿足另乙個性質的方案數即為f[i][i-j+1](全部倒過來)。求f[i]時我們可以視作從1~i的排列刪掉j,原本大於j的都減1,就變成乙個1~i-1的排列,就可以從f[i-1]轉移。求第k大我們列舉每一位取什麼,利用dp陣列計算方案數,做法與dp過程類似。複雜度o(n^3+tn^2)(理論上應該還可以更低)。

#include#include

using

namespace

std;

#define ll long long

#define mn 20ll f[mn+5][mn+5

];int ans[mn+5

];int

main()

for(i=2;i1

)

for(i=n;i--;)for(j=i+1;jif(ans[j]>=ans[i])++ans[j];

for(i=0;i"

%d ",ans[i]);puts(""

); }

}

g.單詞

思路:比較簡單的ac自動機。建出trie樹後我們可以知道每個單詞作為其他單詞字首的出現次數,建出fail樹再dp後我們即可知道每個單詞作為其他單詞子串的出現次數。複雜度o(總長)。

#include#define ll long long

using

namespace

std;

#define mn 200

#define ml 1000000

string s[mn+5

];int c[ml+5][26],f[ml+5],tn,q[ml+5],qn,p[mn+5

];ll v[ml+5

];void

build()

}int

main()

p[i]=k;

}build();

for(i=qn;i;--i)v[f[q[i]]]+=v[q[i]];

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

20161104校內訓練

一道類似模擬的題,就根據所寫的東西來做就可以了。include define rep i l r for int i l i r i define per i r l for int i r i l i define erep i u for int i head u i i e i nxt usi...

2017 4 14校內訓練

hzwer拿了幾道noi中比較簡單的給我們做 a.noi2009 植物大戰殭屍 思路 考慮最小割,如果乙個植物的權值x是正的,我們先預設吃掉它,使答案加上x並讓s向這個點連x,割這條邊相當於不吃這個植物,否則讓這個點向t連 x,割這條邊相當於吃這個植物,每個植物讓它能攻擊到的格仔和它的前一格向它連i...

2017 4 7校內訓練

喪病hzwer的ctsc訓練賽 my ac 3 4 a.ctsc2014 企鵝qq 思路 亂hash,我比較菜,寫的醜 各種wa tle,好久才a掉。include include using namespace std define ll long long define mn 200 defin...