Wannafly挑战赛23A,B,C
A
类似双指针搞一搞就行了
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 char s[1000005]; 5 int used[30]={0}; 6 bool fun() 7 { 8 for(int i=0;i<=25;i++) 9 if(!used[i]) return false; 10 return true; 11 } 12 int main() 13 { 14 cin>>s; 15 int l=0,r=0; 16 int mi=100000000; 17 for(int i=0;s[i];i++) 18 { 19 used[s[i]-'a']++,r++; 20 21 while(fun()) 22 { mi=min(mi,r-l); 23 used[s[l]-'a']--,l++; 24 } 25 26 } 27 cout<<mi<<endl; 28 29 return 0; 30 }
B
筛出1-n的约数,根据sg定理搞一搞就行了。
1 #include<bits/stdc++.h> 2 using namespace std; 3 vector<int>vt; 4 vector<int>divt[100005]; 5 int sg[100005]; 6 int mex() 7 { int num=0,l=vt.size(); 8 for(int i=0;i<l;i++) 9 { 10 if(vt[i]==num) num++; 11 else if(vt[i]>num) break; 12 } 13 return num; 14 } 15 void pre_sg() 16 { sg[0]=0; 17 for(int i=1;i<=100001;i++) 18 { vt.clear(); 19 for(int j=0;j<divt[i].size();j++) 20 vt.push_back(sg[i-divt[i][j]]); 21 sort(vt.begin(),vt.end()); 22 sg[i]=mex(); 23 24 } 25 } 26 int a[100005]; 27 int main() 28 { 29 for(int i=1;i<=100001;i++) 30 for(int j=1;i*j<=100001;j++) 31 divt[i*j].push_back(i); 32 pre_sg(); 33 34 int n; 35 cin>>n; 36 int cnt=0; 37 for(int i=1;i<=n;i++) 38 { 39 cin>>a[i]; 40 cnt^=sg[a[i]]; 41 } 42 int num=0; 43 for(int i=1;i<=n;i++) 44 { int x=cnt^sg[a[i]]; 45 for(int j=0;j<divt[a[i]].size();j++) 46 if(sg[a[i]-divt[a[i]][j]]==x) 47 { 48 num++; 49 } 50 51 } 52 cout<<num<<endl; 53 }
C
感觉题目就让人头大。。
根据求期望的式子:E(X)=p1*x1+p2*x2+p3*x3......
先枚举j假如融资成功了x元(L<=x<=sum),凑齐x元也分许多情况,假如第i种情况的概率为pi,那么这种情况的贡献为pi*(M-分红),累加所有情况,即M*∑pi - E(分红)。
设f[X]为凑齐x元的概率,g[x]为凑齐x元时期望分红,所以将问题转化为求∑(f[x]*M-g[x]).
接着用背包dp求出f[x],g[x]。
f[i][x]=f[i-1][x]*(1-p[i])+f[i-1][x-mi]*p[i],
g[i][x]=g[i-1][x]*(1-p[i])+( g[i-1][x-mi]+mi*ri*f[i-1][x-mi] )*p[i].
1 #include <cstdio> 2 #include <cstring> 3 #include <cctype> 4 #include <iostream> 5 #include <algorithm> 6 #include <queue> 7 #include <stack> 8 #include <set> 9 using namespace std; 10 typedef long long ll; 11 const ll mod=1e9+7; 12 ll kpow(ll a,ll b) 13 { ll res=1; 14 while(b>0) 15 { 16 if(b&1) res=res*a%mod; 17 b/=2; 18 a=a*a%mod; 19 } 20 return res; 21 } 22 ll f[500005],g[500005],m[200],r[200],p[200]; 23 int main() 24 { 25 ll inv100=kpow(100,mod-2); 26 27 ll n,L,M; 28 cin>>n>>L>>M; 29 int sum=0; 30 for(int i=1;i<=n;i++) 31 { 32 scanf("%lld%lld%lld",m+i,r+i,p+i); 33 r[i]=r[i]*inv100%mod; 34 p[i]=p[i]*inv100%mod; 35 36 } 37 f[0]=1; 38 for(int i=1;i<=n;i++) 39 { 40 sum+=m[i]; 41 for(int j=sum;j>=0;j--) 42 { 43 f[j]=f[j]*(1-p[i]+mod)%mod; 44 g[j]=g[j]*(1-p[i]+mod)%mod; 45 if(j>=m[i]) 46 { 47 f[j]+=f[j-m[i]]*p[i]%mod; 48 f[j]%=mod; 49 g[j]+=(g[j-m[i]]+(m[i]*r[i]%mod)*f[j-m[i]]%mod)*p[i]%mod; 50 g[j]%=mod; 51 } 52 53 } 54 } 55 ll ans=0; 56 for(int i=L;i<=sum;i++) 57 { 58 ans=(ans+M*f[i]%mod-g[i])%mod; 59 } 60 cout<<(ans+mod)%mod<<endl; 61 }