Ugly Pairs CodeForces - 1156B

Posted ssummerzzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ugly Pairs CodeForces - 1156B相关的知识,希望对你有一定的参考价值。

题目链接:https://vjudge.net/problem/CodeForces-1156B

题意:给定一串字符,相邻字符的ASCII码不能是相邻的数字,比如ABC,假设ASCII码为,99 100 101 ,

就是不符合题意的字符串,ACF,就可以。

思路:从相邻字符的ASCII码不能是相邻的数字,可以想到字符串之间ASCII码至少差2,然后发现

ACE...假设是奇数ASCII码,BDF是偶数ASCII码,那么我们不妨把他们分成两组,

奇数的字符,偶数的字符,那就简单了,我们可以直接先把奇数的输出,再把偶数的输出,那么字符串

之间相邻字符的ASCII码不能是相邻的数字就很好来解决了,下面字符串都转化为数字,列举一些情况

①  只有偶数

②  只有奇数

③   1 3 5 7 2

④   1 3 5 7 6 

⑤    1 3 2

⑥    1 3 2 4

下面四种情况判定下就OK了,代码有呼应。


 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <queue>
 6 #include <map>
 7 #include <cmath>
 8 #include <iomanip>
 9 using namespace std;
10 
11 typedef long long LL;
12 #define inf (1LL << 25)
13 #define rep(i,j,k) for(int i = (j); i <= (k); i++)
14 #define rep__(i,j,k) for(int i = (j); i < (k); i++)
15 #define per(i,j,k) for(int i = (j); i >= (k); i--)
16 #define per__(i,j,k) for(int i = (j); i > (k); i--)
17 
18 
19 int main()
20 
21     ios::sync_with_stdio(false);
22     cin.tie(0);
23 
24     char str[110];
25     vector<int> one;
26     vector<int> two;
27 
28     int T;
29     cin >> T;
30     while(T--)
31 
32         cin >> str;
33 
34         one.clear(); //奇数
35         two.clear(); //偶数
36         int len = strlen(str) - 1;
37         rep(i,0,len)
38             int tmp = str[i] - a + 1;
39             //判奇偶
40             if(tmp & 1) one.push_back(tmp);
41             else two.push_back(tmp);
42         
43 
44         //排好序,方便比较
45         sort(one.begin(),one.end());
46         sort(two.begin(),two.end());
47         //只有偶数
48         if(one.size() == 0)
49             rep(o,0,(int)two.size() - 1) cout << (char)(a + two[o] - 1);
50             cout << endl;
51         
52         //只有奇数
53         else if(two.size() == 0)
54             rep(o,0,(int)one.size() - 1) cout << (char)(a + one[o] - 1);
55             cout << endl;
56         
57         else
58             int End_b = two.size() - 1;
59             int End_a = one.size() - 1;
60 
61                 //判断③④⑤⑥的情况
62                 if(abs(two[0] - one[End_a]) != 1)
63                     rep(o,0,(int)one.size() - 1) cout << (char)(a + one[o] - 1);
64                     rep(o,0,(int)two.size() - 1) cout << (char)(a + two[o] - 1);  
65                     cout << endl;
66                 
67                 else if(abs(two[End_b] - one[0]) != 1)
68                     rep(o,0,(int)two.size() - 1) cout << (char)(a + two[o] - 1);
69                     rep(o,0,(int)one.size() - 1) cout << (char)(a + one[o] - 1);
70                     cout << endl;
71                 
72                 else cout << "No answer" << endl;
73 
74         
75 
76     
77     
78     getchar(); getchar();
79     return 0;
80 

 

以上是关于Ugly Pairs CodeForces - 1156B的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 159D Palindrome pairs

CodeForces - 1189 E.Count Pairs (数学)

CodeForces 652C Foe Pairs

codeforces 1045I Palindrome Pairs stl+构造

codeforces 652C Foe Pairs 水题

Codeforces1541 B. Pleasant Pairs(暴力,复杂度分析)