sdut acm 4610這題不是簽到題(新生爭霸賽)

在這裏插入圖片描述
思路:
先理解題意,題目要求把數據用1,2分別染色,然後把被1染色的數據組成的串和被2染色的數據組成的串,分別拿出來,要求兩個串接起來是一個非遞減的串。
首先我們要把數據按照從小到大排序,由於數據量大且數據範圍爲0-9,所以應該使用桶排序,不然容易超時。然後把排序後的數據和原數據匹配(如圖方式,藍色爲染成1,紅色爲染成2),第一次匹配的染色爲1,第二次的染色爲2.
在這裏插入圖片描述
下面給出代碼:

#include <bits/stdc++.h>

using namespace std;

int book[10000001];
int tong[11];
char s[10000001];
int main()
{
    int n,i,j,flag=1;
    scanf("%s",s);
    n=strlen(s);
    for(i=0;i<n;i++)//桶排序
    {
        tong[s[i]-'0']++;
    }
    j=0;
    for(i=0;i<n;i++)//第一次染色,染成1
    {
        if(tong[j]==0)//如果桶中數據沒了,則移到下一個桶
        {
            j++;
            i--;//因爲外層for循環有個i++,如果這裏不減一會漏掉一個數據
            continue;
        }
        if(s[i]-'0'==j)//桶中數據與原數據匹配,染色爲1,用book數組記錄
        {
            tong[j]--;
            book[i]=1;
        }
    }
    for(i=0;i<n;i++)//第二次循環染色爲2,同理
    {
        if(tong[j]==0)
        {
            j++;
            i--;
            continue;
        }
        if(s[i]-'0'==j&&book[i]==0)
        {
            tong[j]--;
            book[i]=2;
        }
    }
    for(i=0;i<=9;i++)//如果桶中還有數據,說明沒有全部染色,輸入'-'
    {
        if(tong[i]!=0) flag=0;
    }
    if(flag==0) printf("-");
    else//輸出染色結果
    {
        for(i=0;i<n;i++)
        {
            printf("%d",book[i]);
        }
    }
    return 0;
}

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