[2020智算之道初赛第一场-高校组]Coda的题解集

一共就三道水题,不算很难。

本质是卡常大赛。

比赛结束后代码被挡住了,不过F12+删除元素轻松解决。


排队

开个bool数组表示每个人是否被拉出队列,纯模拟。

#include
using namespace std;
int main()
{
    int n,m,a,b;
    bool li[100010]={0};
    cin>>n>>m;
    for(int k=1;k<=m;k++)
    {
        cin>>a;
        b=a;
        while(b<=n)
        {
            li[b]=1;
            b+=a;
        }
    }
    int cnt=0;
    for(int i=1;i<=n;i++)
        if(!li[i])
            cnt++;
    cout<<cnt;
}

开关

经典开关问题的简化版,因为受影响的是前面的开关,所以从后往前跑。

#include
using namespace std;
int main()
{
    int n,cnt=0;
    char ch;
    bool a[200010];
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>ch;
        if(ch=='0') a[i]=0;
        else a[i]=1;
    }
    for(int i=n;i>=1;i--)
    {
        if(a[i]^cnt&1)
            cnt++;
    }
    cout<<cnt;
}

字符串

尺取+map,题解里说map只能拿60分,hash才能拿100,但是数据强度貌似不太够,map可以AC。

#include
using namespace std;
int main()
{
    int cnt=0;
    string s,t,temp;
    cin>>s>>t;
    map<string,bool> used;
    int cnts[125]={0},cntt[125]={0};
    for(int i=0;i<s.length();i++)
        cnts[s[i]]++;
    for(int i=0;i+s.length()<=t.length();i++)
    {
        if(i==0)
        {
            for(int j=0;j<s.length();j++)
                cntt[t[j]]++;
        }
        else
        {
            cntt[t[i-1]]--;
            cntt[t[i+s.length()-1]]++;
        }
        int same=true;
        for(int j='a';j<='z';j++)
            if(cnts[j]!=cntt[j])
                same=false;
        if(same&&!used[temp.assign(t,i,s.length())])
        {
            used[temp]=true;
            cnt++;
        }
    }
    cout<<cnt;
}

你可能感兴趣的:(算法)