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 }

猜你喜欢

转载自www.cnblogs.com/lnu161403214/p/9577673.html