0%

H.In-place Sorting

H. In-place Sorting

题目描述:

给出 $ n $ 个数字,可以将数字中的 $ 9 $ 翻转为 $ 6 $ ,反之亦可。问能否只靠翻转,得到一个升序序列。能,则输出序列,不能,输出 impossible

数据范围:
$ 1\le n \le 10000, 1\le a_i \le 10^{18} $

题解:

直接模拟,可以先把数字中的 $ 6 $ 全翻转为 $ 9 $ ,第一个数字要全翻转为 $ 6 $ 。然后从高位到低位,如果数值翻转为 $ 6 $ 仍大于前一个,则翻转。如果全是 $ 9 $ 也不能翻转,直接不行

代码:

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using namespace std;
using namespace FAST_IO;
const ll mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const ll INF_LL = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-5;
const int maxn = 1e4 + 10;
const int maxm = 1e5 + 10;
ll n, k;
struct Node
{
ll num;
char s[20];
int len;
void toStr()
{
len = 0;
ll tmp = num;
while (tmp)
{
s[len] = tmp % 10 + '0';
len++;
tmp /= 10;
}
}

void toll()
{
ll tmp = 1;
num = 0;
for (int i = 0; i < len; i++)
{
num *= tmp;
num += s[i] - '0';
tmp *= 10;
}
}

void toNine()
{
ll tmp = 1;
for (int i = 0; i < len; i++)
{
if (s[i] == '6')
{
s[i] = '9';
num += 3ll * tmp;
}
tmp *= 10;
}
}
} a[maxn];
int main()
{
// #define COMP_DATA
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
read(n);
for (int i = 1; i <= n; i++)
{
read(a[i].num);
a[i].toStr();
}
Node pre;
pre.num = 0;
pre.toStr();
bool flag;
for (int i = 1; i <= n; i++)
{
flag = true;
a[i].toNine();
ll tmp = pow(10, a[i].len - 1);
for (int j = a[i].len - 1; j >= 0; j--)
{
if (a[i].num >= pre.num)
{
if (a[i].s[j] == '9')
{
if (a[i].num - 3ll * tmp >= pre.num)
{
a[i].s[j] = '6';
a[i].num -= 3ll * tmp;
}
}
}
else
{
flag = false;
break;
}
tmp /= 10;
}
pre = a[i];
if (!flag)
break;
}

if (flag)
{
printf("possible\n");
for (int i = 1; i <= n; i++)
{
printf("%lld\n", a[i].num);
}
}
else
{
printf("impossible\n");
}
return 0;
}