Harbour.Space Scholarship Contest 2021-2022(Div.1+2)

Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)

闲话:lzw牛逼!这场上青了,b题我反复读读不懂,靠两个队友给我解释。最后也是懵懵懂懂且fst了,还好我及时跑去切c,总的来说abcd都不难,手速场。
重复一遍 lzw牛逼!

A. Digits Sum

题意

A
定义函数S(X)表示正整数x各项之和,若S(X)>S(X+1)则称x为interesting。给出n问1<=x<=n且x是interesting的这样子的x的个数。

题解

很明显只有在进位的时候才会产生interesting的情况,因此(n+1)/10即可。

code

int main()
{
    ll n;cin>>n;
    while(n--){
        ll d;cin>>d;
        d+=1;
        cout<<d/10<<'\n';
    }
	return 0;
}

B. Reverse String

题意

B
给两个字符串s和t。对s进行扫描能否得到t。扫描指:选择一个位置开始向右扫描若干次,再向左扫描若干次,每次扫描的那个位置对应的字符记录下来,最后得到一串字符,即是扫描得到的字符。

题解

s长度最大500,考虑直接暴力扫描,从0开始向右扫i个再向左扫到0,那么如果存在答案,t一定是某个i扫描后的结果的子串。
代码参考了这位up的,觉得这段string用的比较灵活。

code

#define pno cout<<"NO\n"
#define pyes cout<<"YES\n"
string s,t,v;
bool ok;
void check(string cur)
{
    if(cur.find(t)!=cur.npos)ok=1;//find substr
}
void solve()
{
    cin>>s>>t;ok=0;
    for(ll i=1;i<=s.size();i++)
    {
        v=s.substr(0,i);//v- s[0~i]
        reverse(v.begin(),v.end());//v- s[i~0]
        check(s.substr(0,i)+v.substr(1,v.size()-1));// s[0~i]+s[i-1~0]
    }
    if(ok)pyes;
    else pno;
}

C. Penalty

题意

C
点球比赛,最多十回合,交替点球。给出长为10的字符串代表每次点球的情况,1表示必进,0表示必不进,?表示未知。要求最少回合数。

题解

假设两个人为A和B。
考虑到?是可以由自己分配的,那么在每个人胜利为前提的情况结束时可以将其视为1。从头到尾扫过去,当A得分超过一半,或者A的得分-B的得分>B剩下的局数(说明B就算下来每场都得分也赢不了),此时比赛必然结束。

code

int main()
{
    ll n;cin>>n;
    while(n--){
        string s;cin>>s;
        int x0=0,x1=0,x=0;
        int y0=0,y1=0,y=0;
        int ans=0;
        bool flag=0;
        for(int i=0;i<10;i++){
            ans++;
            if(i%2){
                if(s[i]=='0')x0++;
                else if(s[i]=='1')x1++;
                else x++;
            }
            else {
                if(s[i]=='0')y0++;
                else if(s[i]=='1')y1++;
                else y++;
            }
            if(x1+x>5||y1+y>5||(x1+x)-(y1)>5-(i+2)/2||(y1+y)-(x1)>5-(i+1)/2){
                cout<<ans<<'\n';
                flag=1;
                break;
            }
        }
        if(flag==0)cout<<ans<<'\n';
    }
	return 0;
}

D. Backspace

题意

D
两个字符串s和t,对着s进行输入能否得到t。输入指:对于第i次输入可以输入回退键,这会使t最后一个字符删掉(如果存在),或者将s的第i个字符输入到t的末尾。

题解

t倒着扫描,从s末尾一个一个跳,如果s[i]=t[i]说明此时输入了,否者说明此时输了回退键,那么前面的字符也被删掉了,所以这时要跳过s两个字符。(回退键占了一个,删掉了占了一个,所以是两个)

code

#define pno cout<<"NO\n"
#define pyes cout<<"YES\n"
int main()
{
    IOS
    ll t;
    cin>>t;
    while(t--){
        string s,t;cin>>s>>t;
        ll lens=s.size(),lent=t.size();
        if(lens<lent)pno;
        else{
            for (ll i=lens-1;i>=0;i--){
                if(s[i]!=t[lent-1]){if(i>0)i--;}
                else {lent--;if(lent==0)break;}
            }
            if(lent==0)pyes;else pno;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值