码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Educational Round 81 解题报告

时间:2020-02-03 13:25:52      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:string   amp   link   mat   printf   输出   lld   math   lse   

前置扯淡

赛前:这场\(Div2\)呀,那我写\(3\)题就行,\(D\)题尽力就好

赛中:啊啊,\(ABC\)我全过了\(pretest\),我太强了!!这把上蓝稳了

赛后:\(woc\),为啥被\(hack\)了两道!!\(newbie\) \(yspm\)认证成功了……

题目&&解答

A.Display The Number

link

思路

水题一道,直接\(1\)\(7\)随便输出就行

CODE

#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace yspm{
    inline int read()
    {
        int res=0,f=1; char k;
        while(!isdigit(k=getchar())) if(k=='-') f=-1;
        while(isdigit(k)) res=res*10+k-'0',k=getchar();
        return res*f;
    }
    inline void work()
    {
        int x=read(); if(x%2==0) while(x) cout<<1,x-=2;
        else{cout<<7; x-=3; while(x) cout<<1,x-=2;}
        return cout<<endl,void();
    }
    signed main()
    {
        int T=read(); while(T--) work();
        return 0;
    }
}
signed main(){return yspm::main(); } 

B.Infinite Prefixes

link

思路

这个题细节有一点点多

预处理出来\(s\)串中每一个前缀的\(0\)\(1\)的差值,记为\(a[\space ]\)

\(a[s.length()]\)的值

\(1^0\) 如果为\(0\),就考虑正无穷的情况

如果有一个\(a_i\)的值与\(x\)相同,就直接为正无穷,否则为\(0\)

\(2^0\) 如果不为\(0\),就考虑同余

当前位置的\(a[\space]\)值和\(x\)是否关于\(a[s.length()]\)同余即可

还要注意正负性

CODE

#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace yspm{
    inline int read()
    {
        int res=0,f=1; char k;
        while(!isdigit(k=getchar())) if(k=='-') f=-1;
        while(isdigit(k)) res=res*10+k-'0',k=getchar();
        return res*f;
    }
    const int N=1e5+10;
    int a[N],n,x; string s;
    inline void work()
    {
        a[0]=0; n=read(); x=read(); cin>>s;
        for(int i=0;i<n;++i)
        {
            if(s[i]=='0') a[i+1]=a[i]+1;
            else a[i+1]=a[i]-1;
        }
        int p=a[n];
        if(!p)
        {
            for(int i=1;i<=n;++i)
            {
                if(a[i]==x) return puts("-1"),void();
            }puts("0");
        }
        else 
        {
            int ans=(x==0);
            for(int i=1;i<=n;++i)
            {
                if((x-a[i])*p>=0&&(x-a[i])%p==0) ++ans; 
            } printf("%lld\n",ans);
        }
        return ;
     } 
    signed main()
    {
        int T=read(); while(T--) work();
        return 0;
    }
}
signed main(){return yspm::main(); } 

这个题当时没有想到怎么处理正负性,这个乘积与\(0\)的大小关系还是可以进行频繁利用的

Codeforces Educational Round 81 解题报告

标签:string   amp   link   mat   printf   输出   lld   math   lse   

原文地址:https://www.cnblogs.com/yspm/p/12255071.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!