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;
}

猜你喜欢

转载自blog.csdn.net/Here_SDUT/article/details/103637363
今日推荐