我是靠谱客的博主 自然超短裙,最近开发中收集的这篇文章主要介绍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;
}

最后

以上就是自然超短裙为你收集整理的sdut acm 4610这题不是签到题(新生争霸赛)的全部内容,希望文章能够帮你解决sdut acm 4610这题不是签到题(新生争霸赛)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部