Atcoder Tenka1 Programmer Contest 2019
阿新 • • 發佈:2019-04-21
pan eve 轉移 none clu char == sca view
C
簽到題,f[i][0/1]表示以i結尾最後一個為白/黑的最小值,轉移顯然。
#include<bits/stdc++.h> using namespace std; const int N=2e5+7; int n,f[N][2]; char s[N]; int main() { scanf("%d",&n); scanf("%s",s+1); for(int i=1;i<=n;i++) if(s[i]==‘.‘) { f[i][0]=f[i-1][0]; f[i][View Code1]=min(f[i-1][0],f[i-1][1])+1; } else{ f[i][0]=f[i-1][0]+1; f[i][1]=min(f[i-1][0],f[i-1][1]); } printf("%d\n",min(f[n][0],f[n][1])); }
D
方案數=總方案數-不能拼成三角形的方案數。不能拼成三角形,即最長邊大於等於邊總和的一半。於是可以f[i]表示以i為最長邊能組成三角形的方案數,g[i]表示湊成長度為i的邊方案。f[0]=2^n,g[0]=1,然後每次轉移f除以2即可。註意討論最長邊為總和一半的情況(沒討論WA了一發)。
#include<bits/stdc++.h> using namespace std; const int N=307,mod=998244353,inv2=499122177,inv3=332748118; int n,ans,sum,lim,pw2[N],pw3[N],a[N],f[N*N],g[N*N]; int main() { scanf("%d",&n); ans=f[0]=g[0]=1; for(int i=1;i<=n;i++)f[0]=2ll*f[0]%mod; for(int i=1;i<=n;i++) { ansView Code=3ll*ans%mod; scanf("%d",&a[i]); sum+=a[i]; for(int j=sum;j>=a[i];j--) f[j]=(f[j]+1ll*f[j-a[i]]*inv2)%mod,g[j]=(g[j]+g[j-a[i]])%mod; } lim=(sum+1)/2; for(int i=lim;i<=sum;i++)ans=(ans-3ll*f[i]%mod+mod)%mod; if(sum%2==0)ans=(ans+3ll*g[lim])%mod; printf("%d\n",ans); }
E
咕
F
咕
rank=105,rating+=108,因為原本rating過低。
Atcoder Tenka1 Programmer Contest 2019