【FZSZ2017暑假提高组Day9】猜数游戏(number)
题目描述
今天你交到了一个新的friend, 他想要考考你。
于是他把自己的电话号码写成了一系列的英文单词,
比如说012
就写成了ZEROONETWO
然后,他干了一件很恶趣味的事,那就是把这个字符串 打·乱·了
比如上面的字符串可能就变成OWTZEOORNE
他想要考考你你能不能从这个打乱的字符串SS还原出原来的电话号码
正常情况下这当然是不可能的,不过他给了你一个提示,你能够确定的是,它的电话号码是不降的,也就是说,只会有001122
这样的号码,而不会有010122
这样的号码
题目数据保证有唯一解
输入格式
输入一行一个字符串,只包含大写字母
字符串由以下单词拼接并打乱而成,ZERO
, ONE
, TWO
, THREE
, FOUR
, FIVE
, SIX
, SEVEN
,EIGHT
, NINE
输出格式
输出一行字符串,表示还原的电话号码,题目保证每个输入都有唯一的解
数据规模及约定
对于 100%100%的数据 3≤|S|≤20003≤|S|≤2000
对于 20%20%的数据 3≤|S|≤203≤|S|≤20
样例输入
OZONETOWER
WEIGHFOXTOURIST
OURNEONFOE
ETHER
样例输出
012
2468
114
3
题解
很容易确定某些数字是肯定存在的,然后根据这种限制关系优先处理一下。然后暴力搜索一下就可以了。
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 #include <cmath> 6 using namespace std; 7 const int M = 2000 + 10; 8 const int N = 100 + 5; 9 char tmp[M]; 10 int b[N], ans[10]; 11 int main() 12 { 13 14 scanf("%s", &tmp); 15 for(int i=0; i<strlen(str); ++i) 16 b[str[i]-'A']++; 17 while(b[25]>0 && b[4]>0 && b[17]>0 && b[14]>0) 18 ans[0]++, b[25]--, b[4]--, b[17]--, b[14]--; 19 while(b[19]>0 && b[22]>0 && b[14]>0) 20 ans[2]++, b[19]--, b[22]--, b[14]--; 21 while(b[18]>0 && b[8]>0 && b[23]>0) 22 ans[6]++, b[18]--, b[8]--, b[23]--; 23 while(b[18]>0 && b[4]>1 && b[21]>0 && b[13]>0) 24 ans[7]++, b[18]--, b[4]-=2, b[21]--, b[13]--; 25 while(b[5]>0 && b[8]>0 && b[21]>0 && b[4]>0) 26 ans[5]++, b[5]--, b[8]--, b[21]--, b[4]--; 27 while(b[5]>0 && b[14]>0 && b[20]>0 && b[17]>0) 28 ans[4]++, b[14]--, b[20]--, b[17]--, b[5]--; 29 while(b[19]>0 && b[7]>0 && b[17]>0 && b[4]>1) 30 ans[3]++, b[19]--, b[7]--, b[17]--, b[4]-=2; 31 while(b[4]>0 && b[13]>0 && b[14]>0) 32 ans[1]++, b[4]--, b[13]--, b[14]--; 33 while(b[4]>0 && b[8]>0 && b[6]>0 && b[7]>0 && b[19]) 34 ans[8]++, b[4]-- ,b[8]--, b[6]--, b[7]--, b[19]--; 35 while(b[8]>0 && b[4]>0 && b[13]>1) 36 ans[9]++, b[8]--, b[4]--, b[13]-=2; 37 for(int i=0; i<=9; ++i) 38 for(int j=1; j<=a[i]; ++j) 39 printf("%d", i); 40 printf("\n"); 41 return 0; 42 }