我是靠谱客的博主 自然超短裙,这篇文章主要介绍sdut acm 4610这题不是签到题(新生争霸赛),现在分享给大家,希望可以做个参考。

在这里插入图片描述
思路:
先理解题意,题目要求把数据用1,2分别染色,然后把被1染色的数据组成的串和被2染色的数据组成的串,分别拿出来,要求两个串接起来是一个非递减的串。
首先我们要把数据按照从小到大排序,由于数据量大且数据范围为0-9,所以应该使用桶排序,不然容易超时。然后把排序后的数据和原数据匹配(如图方式,蓝色为染成1,红色为染成2),第一次匹配的染色为1,第二次的染色为2.
在这里插入图片描述
下面给出代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#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内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部