模擬測試 20190809

2022-02-03 13:43:26 字數 3673 閱讀 7591

一次比一次差是要鬧哪樣啊,次次都看錯題什麼狀態啊,下次是不是就爆零了啊......

可能是最近知識學得太快了吧,什麼都來不及深究就馬上考試or進入下乙個專題,做題也僅限於學長講過的(沒講過的直接死亡(某數字dp))

集訓還有10天,不知不覺過去這麼長時間了,我承認最近確實有點浮躁,做題總是靜不下心

再這樣可能真的要退役了吧(笑),可是我不想啊

所以接下來努力吧,儘管努力並不一定有回報,但不嘗試又怎麼知道結果呢

以上t1:建設城市(city)

和之前一道考試題很像啊......但是資料強了很多,然而我還是只會打n^2暴力,加上特判總共獲(pian)得(dao)了70pts

正解很明顯的容斥啊......考試時候總想著需要列舉每個人而不敢打容斥(其實對每個人的列舉合併就能得到乙個非常簡單的柿子了)

考完才發現對每個人的列舉是一樣的,也就是說只需要列舉重合的人就好了

全集是c(m-1,n-1),容斥掉有超過k的,列舉超過的天數,對於天數i,超過i天的方案即為c(n,i)*c(m-i*k-1,n-1)(把)

容斥一發,奇減偶加就好了

#include#define int long long

#define cri const register int

#define re register

using

namespace

std;

const

int mod=998244353

;int jie[10000010],ni[10000010

];inline

intc(cri x,cri y)

inline

int qpow(int a,int

b) signed main()

jie[

0]=1

;

for(int i=1;i<=m;i++) jie[i]=1ll*jie[i-1]*i%mod;

ni[m]=qpow(jie[m],mod-2

);

for(int i=m;i>=1;i--) ni[i-1]=1ll*ni[i]*i%mod;

ans=c(m-1,n-1

);

//cout

ans=(ans+1ll*j*c(n,i)*c(m-i*k-1,n-1)%mod+mod)%mod;

printf(

"%lld

",ans);

}

view code

t2:轟炸行動(bomb)

全場最水,然而半個機房由於看錯題喜提10分的好成績

仔細看題我們發現在一條鏈上的兩兩都不能同時轟炸,乙個強聯通分量上的同理

然後我們建圖,tarjan,拓撲就好了

#include#define ll long long

#define cri const register int

#define re register

using

namespace

std;

int num,cnt,dcc,fa[1000010],to[2000010],la[2000010],bl[1000010

];int dfn[1000010],low[1000010],sta[1000010],top,size[1000010],fr[1000010

];inline

void

add(cri x,cri y)

int tos[1000010],las[1000010],cnts,du[1000010],dp[1000010],v[1000010

];inline

void

adds(cri x,cri y)

void

tarjan(cri x)

else

if(v[to[i]])low[x]=min(low[x],dfn[to[i]]);

if(low[x]==dfn[x])

while(y!=x);

//puts("");}}

signed main()

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

if(!dfn[i]) tarjan(i);

memset(fa,

0,sizeof

fa);

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

if(bl[to[i]]!=bl[fr[i]]) adds(bl[fr[i]],bl[to[i]]),du[bl[to[i]]]++;

queue

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

if(!du[i]) q.push(i);

while(!q.empty())

}printf("%d

",ans);

}

view code

t3:石頭剪刀布(rps)

神dp,考場上一度以為是np完全不可做(現在我也這麼認為),打了騙分想騙20然而只弄到10分

由於我們根本無法完全分析出最優決策,模擬or考慮順序絕對吃屎

等等怎麼想到的?發生了什麼?(反正我想不到啊喂)

但dp陣列顯然無法直接轉移,我們考慮輔助陣列g[i][j][k],表示出現了i個石頭,j個剪刀,k個布的概率

顯然有g[i][j][k]+=g[i-1][j][k]*r[t]+g[i][j-1][k]*s[t]+g[i][j][k-1]*p[t]

f陣列也有相似轉移,即

f[i][j][k][l]+=f[i-1][j][k][l]*r[t]+f[i][j-1][k][l]*s[t]+f[i][j][k-1]*p[t]+g[i][j][k]*(r[t]+s[t]+p[t])

複雜度o(n^4)

#include#define ll long long

#define cri const register int

#define crs const register short

#define re register

using

namespace

std;

intn;

long

double ans,f[55][55][55][5],sjb[4][55],c[55][55

];signed main()

c[0][0]=1

;

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

f[0][0][0][0]=1

;

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

for(int i=t;i>=0;i--)

for(int j=t-i;j>=0;j--)

for(int k=t-i-j;k>=0;k--)

for(int now=(t==i+j+k?0:3);now>=0;now--)

for(int i=0;i)

for(int j=0;j+i)

for(int k=0;i+j+k)

ans+=max(f[i][j][k][1]+f[i][j][k][2]*3,max(f[i][j][k][2]+f[i][j][k][3]*3,f[i][j][k][3]+f[i][j][k][1]*3))/(c[n][i+j+k]*c[n-i-j-k][1

]); printf(

"%.15lf

",ans);

}

view code

2019 08 09 NOIP提高組 模擬 A 組

t1 這題其實很簡單。對於那些傳送門操作,我們設a b c d分別表示乙個位置到上下左右的最近乙個 的距離,那麼我們會發現其實這個點到這4個點的距離可以用min a,b,c,d 來替換。即a b c d可以用min a,b,c,d 來替換。這樣我們就可以預處理出每乙個點的a b c d,然後直接sp...

2019 08 09學習整理

函式是第一類物件,即函式可以被當做資料處理。1.引用 x hello nick y x f func print f 2.當作引數傳給乙個函式 len x def foo m m foo func from func3.可以當作函式的返回值 def foo x return x res foo fu...

csp模擬 模擬測試16

fdasds include using namespace std define cle a memset a,0,sizeof a inline int read const int mod 1e9 7,maxn 1e3 100 int n,m,ans 0 int f maxn maxn int...