11.4模拟赛

来源:互联网 发布:php 在线直播 编辑:程序博客网 时间:2024/05/25 19:59

= =打了一次模拟赛把,做了差不多2个小时,140分= =,其实题目蛮简单的,第一题是关于字符串的匹配问题,n<=100的数据,O(n3)算法随便过啊,毫无疑问的a掉了。
代码

#include<cstdio>#include<iostream>#include<string>#include<cstring>#include<algorithm>using namespace std;string s;int difa,difb,p,ans;int main(){    //freopen("message.in","r",stdin);    //freopen("message.out","w",stdout);    cin>>s;    int l=s.length();    for (int i=0;i<l;i++)    {        for (int j=i+1;j<l;j++)        {            if (s[i]==s[j])            {                difa=i;                difb=j;                p=0;                while(s[difa]==s[difb]&&difa<l&&difb<l)                {                    //cout<<difa<<' '<<difb<<' ';                    difa++;                    difb++;                    p++;                }                if(p>ans)ans=p;                 //if (p==7)cout<<i<<' '<<j;            }        }    }    cout<<ans;    //fclose(stdin);    //fclose(stdout);    return 0; } 

第二题是一个向日葵,题解应该是贪心(Kruskal)求最大生成森林,然后用所有边减去最大生成森林的边权。题目实际也并不难,然而犯了傻逼错误数组开小了,边的个数开了100000的数组,然而数据范围是200000的QAQ,非常非常伤心,于是只得了40分TAT。

#include<cstdio>#include<iostream>#include<string>#include<cstring>#include<algorithm>using namespace std;struct edge{    int u,v,w;}e[200010];int n,m,ji[100010],fat[100010];long long int ans,cnt,tot=0;int father(int x){if (fat[x]==x)return x;else {fat[x]=father(fat[x]); return fat[x];}}int cmp(const edge &x,const edge &y) {return x.w>y.w;}int unionn(int x,int y){int fa=father(x),fb=father(y);if (fa==fb)return 0;fat[fa]=fb;return 1;}int main(){    //freopen("sunflower.in","r",stdin);    //freopen("sunflower.out","w",stdout);    cin>>n>>m;    for (int i=1;i<=m;i++)    {        scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);        tot+=e[i].w;    }    for (int i=1;i<=n;i++)    fat[i]=i;    sort(e+1,e+m+1,cmp);    for (int i=1;i<=m;i++)    {        if(unionn(e[i].u,e[i].v))        {            cnt++;            ans+=e[i].w;            if (cnt==n-1)break;        }    }     cout<<tot-ans;    return 0;    //fclose(stdin);    //fclose(stdout);    return 0; } 

t3原本以为是组合数问题,认真看了看题发现可以用容斥+hash做
= =然后读入的处理就出现了问题,调了一个小时都没调出来,果断写了一个30分的暴力,然后大休心切交上了程序。QAQ结果暴力都没对,一脸肯定地跟sky说这题用容斥来做,然后就被打脸了23333.
看了一下hzw的题解好像不难,并不是很喜欢hzw的代码风格,特别紧凑,但是能很轻易地看出dalao高超的代码水平,毕竟也是金牌dalao。我这种蒟蒻能拿1=就很满足了QAQ。

#include<cstdio>int a[10],cnt[1024];long long ans;char B[1<<26];int main(){    //freopen("pals.in","r",stdin);    //freopen("pals.out","w",stdout);    register int n;    scanf("%d",&n),ans=1ll*n*(n-1)/2,fread(B,1,1<<26,stdin);    for(char *S=B;n--;){        int x=0;        for(;*S<'0';S++);        for(;a[*S++-'0']=1,*S>='0';);        for(int i=0;i<10;i++)x+=a[i]<<i,a[i]=0;        cnt[x]++;    }    for(int i=0;i<1024;i++)    for(int j=i+1;j<1024;j++)    if((i&j)==0)ans-=1ll*cnt[i]*cnt[j];    printf("%lld",ans);    //fclose(stdin);    //fclose(stdout);    return 0;}

此题用了大量的位运算,不得佩服黄学长深厚的代码水平。

• 由于 123 和 321 在这道题中是等价的,因此我们只需记录
⼀个数里面哪些数字出现过了
• 由于 210=1024,所以统计的时候用 1024*1024 的复杂度没
有问题。采用补集思想,所有合法⽅案数为 n · (n − 1)/2,
其中不合法⽅ 案为
1023 1023
∑ ∑ [i&j == 0] · cnti · cntj
i=0 j=i+1

0 0
原创粉丝点击