一次比一次差是要鬧哪樣啊,次次都看錯題什麼狀態啊,下次是不是就爆零了啊......
可能是最近知識學得太快了吧,什麼都來不及深究就馬上考試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 longview code#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);
}
t2:轟炸行動(bomb)
全場最水,然而半個機房由於看錯題喜提10分的好成績
仔細看題我們發現在一條鏈上的兩兩都不能同時轟炸,乙個強聯通分量上的同理
然後我們建圖,tarjan,拓撲就好了
#include#define ll long longview code#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);
}
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 longview code#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);
}
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...