AtCoder Grand Contest 039

再戰atcoder,誤入grand局,賽後才意識到。偶然間發現,一年多前自己也是通過grand局狂漲800+分,甚是巧合

A - Connection and Disconnection

思路:這題就是一個簡單的字符串計算問題,子串複製多次後變換最少元素消除連續相同元素。對於連續元素,其實只需要向下取整相間消除即可完成,最後單獨統計一下首尾,處理掉複製連接處,再考慮一下所有元素均相同的情況即可。

/*
Author:Owen_Q
*/

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int maxn = 1e7+5;

vector<int> col;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    //freopen(".txt","r",stdin);
    string s;
    int k;
    cin >> s >> k;
    col.clear();
    int len = s.size();
    int num = 1;
    char c = s[0];
    int sum = 0;
    for(int i=1;i<len;i++)
    {
        if(s[i]==c)
            num++;
        else
        {
            col.push_back(num);
            sum += num/2;
            num = 1;
            c = s[i];
        }
    }
    col.push_back(num);
    int siz = col.size();
    if(siz==1)
    {
        cout << (ll)(len)*(ll)(k)/2LL << "\n";
    }
    else if(s[0]==s[len-1])
    {
        sum -= col[0]/2;
        cout << (ll)(sum)*(ll)(k) + (ll)(col[0]/2) + (ll)(col[siz-1]/2) + (ll)((col[0]+col[siz-1])/2) * (ll)(k-1);
    }
    else
    {
        sum += col[siz-1]/2;
        cout << (ll)(sum)*(ll)(k) << "\n";
    }
    return 0;
}

B - Graph Partition

思路:對於圖論問題,比較常見的就是搜索系列的bfs,dfs,處理邊系列的最短路,最小生成樹,還有就是網絡流系列。

本題要求對點分組,要求鄰邊所對應得點必須鄰組。昏昏沉沉之中想着找最長鏈,判環一堆什麼亂七八糟的操作,最終只得無功而返。其實這題就是個分層問題,bfs所得的不同層元素必鄰組,枚舉每個頂點作爲bfs起點,先分組,後判斷驗證

/*
Author:Owen_Q
*/

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int maxn = 205;

bool s[maxn][maxn];
int in[maxn];
queue<int> q;

int n;
/*
int dfs(int pre,int now,int num)
{
    in[now] = num;
    int re = 0;
    for(int i=1;i<=n;i++)
    {
        if(i==pre)
            continue;
        if(s[now][i])
        {
            if(in[i]>=0)
            {
                if(num-in[i]!=3)
                    continue;
                //cout << in[i] << "*" << num <<"*"<<i<<"*"<<now << "*" << s[now][i]<< endl;
                else
                    return -1;
            }
            else
            {
                int temp = dfs(now,i,num+1);
                if(temp>re)
                    re = temp;
            }
        }
    }
    in[now] = -1;
    return max(re,num);
}

int main()
{
    //freopen(".txt","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        char temp;
        scanf("%c",&temp);
        for(int j=1;j<=n;j++)
        {
            scanf("%c",&temp);
            //cout << i << "&" << "&"<<temp;
            //cout << temp;
            s[i][j] = (temp=='1' ? true : false);
        }
        //cout << "\n";
    }
    //cout << s[3][3] << "%" << endl;
    bool ok = true;
    int re = 0;
    for(int i=1;ok&&i<=n;i++)
    {
        memset(in,-1,sizeof in);
        int l1=0,l2=0;
        for(int j=1;ok&&j<=n;j++)
        {
            if(s[i][j])
            {
                in[i] = 0;
                int now = dfs(i,j,1);
                if(now == -1)
                    ok = false;
                else
                {
                    if(now>l1)
                    {
                        l2=l1;
                        l1=now;
                    }
                    else if(now>l2)
                        l2=now;
                }
            }
        }
        if(l1+l2+1>re)
        {
            re = l1 + l2 + 1;
            cout << i << "^" << l1 << "^" << l2 <<endl;
        }
    }
    if(ok)
        printf("%d\n",re);
    else
        printf("%d\n",-1);
    return 0;
}
*/
/*
dfs行不通,考慮bfs
*/

int myabs(int k)
{
    if(k<0)
        k = k * (-1);
    return k;
}

int main()
{
    //freopen(".txt","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        char temp;
        scanf("%c",&temp);
        for(int j=1;j<=n;j++)
        {
            scanf("%c",&temp);
            //cout << i << "&" << "&"<<temp;
            //cout << temp;
            s[i][j] = (temp=='1' ? true : false);
        }
        //cout << "\n";
    }
    //cout << s[3][3] << "%" << endl;
    int re = -1;
    for(int i=1;i<=n;i++)
    {
        memset(in,-1,sizeof in);
        q.push(i);
        in[i]=1;
        int other = n;
        int now;
        while(other)
        {
            now = q.front();
            //cout << now << endl;
            //exit(-1);
            q.pop();
            other--;
            for(int j=1;j<=n;j++)
            {
                if(s[now][j]&&in[j]==-1)
                {
                    //cout << j << "*" << endl;
                    q.push(j);
                    in[j] = in[now]+1;
                }
            }
            //exit(-1);
        }
        //cout << i << "*"<<in[now] << endl;
        bool ok = true;
        for(int j=1;ok&&j<n;j++)
            for(int k=j+1;ok&&k<=n;k++)
                if(s[j][k]&&(myabs(in[j]-in[k])!=1))
                    ok = false;
        if(ok&&in[now]>re)
            re = in[now];
    }
    printf("%d\n",re);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章