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

代码比第一场简单,但是题面给得很长,一不小心读漏了就会吃WA。

一开始给的错误样例给我看傻了。

又是卡常大赛。


声控灯

这题挖了不少坑,需要打特判:
n=1时,只能在第一层,输出1;
n=2时,无论在哪层,两层的灯都是亮的,无法通过看灯判断位置,输出-1;
n>2时,如果m=2,则在最顶层或最底层,看灯亮的层数判断一下就行,m=3,就是中间那个层数。

#include
using namespace std;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t,n,m,a[3];
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        for(int i=0;i<m;i++)
            cin>>a[i];
        if(n==1)
            cout<<1<<endl;
        else if(n==2)
            cout<<-1<<endl;
        else
        {
            if(m==2)
            {
                if(a[0]==1)
                    cout<<1<<endl;
                else
                    cout<<n<<endl;
            }
            else
                cout<<a[1]<<endl;
        }
    }
}

构造字符串

题面给了很长,其实非常简单。遍历每种字母,同种字母每够n个,就把最大公共前缀延长1。

#include
#define int long long
using namespace std;
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t,n,a,ans=0;
    cin>>n;
    for(int i=1;i<=26;i++)
    {
        cin>>a;
        ans+=a/n;
    }
    cout<<ans<<endl;
}

情报战

set+dfs,其实正解是并查集,说是dfs只能拿50,但又是数据强度不够被A掉了,不过时间跑掉了1k5ms,基本上在300分里算是倒数了。(T3评测跑的是真的慢,交一次三分钟)

#include
using namespace std;
const int MAXN=3e5+7;
int n,m,type,x,y,a[MAXN],ans=0;
set<int> s[MAXN];
void update(int num)
{
    for(set<int>::iterator it=s[num].begin();it!=s[num].end();it++)
    {
        if(!a[*it])
        {
            a[*it]=1;
            ans++;
            update(*it);
            s[num].erase(it);
        }
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>m;
    while(m--)
    {
        cin>>type;
        if(type==1)
        {
            cin>>x;
            if(!a[x])
            {
                a[x]=1;
                ans++;
                update(x);
            }
        }
        else
        {
            cin>>x>>y;
            if(!a[x]&&!a[y])
            {
                s[x].insert(y);
                s[y].insert(x);
            }
            else if(a[x]&&!a[y])
            {
                a[y]=1;
                ans++;
                update(y);
            }
            else if(a[y]&&!a[x])
            {
                a[x]=1;
                ans++;
                update(x);
            }
        }
        cout<<ans<<endl;
    }
}

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