概述
思路:
先理解题意,题目要求把数据用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这题不是签到题(新生争霸赛)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复