zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Python生成验证码
    Django设置
    OpenStack安装后检查流程总结
    利用src.rpm包修改源码后重新制作rpm包
    Python知识点:distutils常用子模块
    libvirt, libvirt-python, libvirtd 关系浅析
    Python知识点: os.popen
    Python知识点: __import__
    修改initrd.img里ko文件的一个小tips
    关于openstack自动化安装的一点思考
  • 原文地址:https://www.cnblogs.com/lnu161403214/p/9577673.html
Copyright © 2011-2022 走看看