输入一个正整数
代表限制。
输出一个正整数,代表不小于
的最小“双生数”。该数字不包含前导零。
123
1100
在这个样例中,
的第一、二个数位相同,第三、四个数位相同。我们可以证明,这是符合要求的最小的双生数。
114514
115500
num = [int(n) for n in input().strip()]
num = ([0, 0, 0] if len(num) % 2 else [0, 0]) + num
altered = False
i = 0
while i < len(num):
if altered:
# 之前变过了没问题,那剩下必然是交替01序列
num[i] = num[i + 1] = 1 if num[i - 1] == 0 else 0
else:
if num[i] != num[i + 1]:
num[i] = num[i + 1] = num[i] if num[i] > num[i + 1] else num[i] + 1
altered = True
if i > 1 and num[i] == num[i - 1]:
if num[i] == 9: # 连续9999
num[i - 3] += 1
i -= 6 # 退回到4位前的二元组重新处理,因为while循环最后还有i += 2这里补偿一下
altered = False
else:
num[i] = num[i + 1] = num[i] + 1
altered = True
i += 2
# 删除赘余0
for j in range(len(num)):
if num[j] != 0:
print("".join([str(n) for n in num[j:]]))
break
x=input()
if len(x)%2==1:
x=x.zfill(len(x)+1)
result=[]
length=len(x)//2
flag=-2
for i in range(length):
a = int(x[2 * i:2 * i + 2])
num = (a // 11 + 1) * 11 if a%11!=0 else -1
if a % 11 == 0 and a!=flag:
result.append(f"{a:02d}")
flag=a
continue
elif a==flag&nbs***bsp;num==flag:
result.append(str(a+11) if a==flag else str(num+11))
else:
result.append(str(num))
for _ in range((length-i)//2):
result.append('00')
result.append('11')
break
pos1=i
result=result[:length]
flag=0
pos=-1
for i in range(pos1,-1,-1):
if flag==1:
result[i]=str(int(result[i])+11)
flag=0
if i-1>=0:
if result[i] == result[i-1]:
result[i]=str(int(result[i])+11)
if len(result[i])>=3:
result[i]='00'
flag=1
pos=i
if pos!=-1:
result=result[:pos]
for _ in range((length-pos+1) // 2):
result.append('00')
result.append('11')
if flag==1:
result=['11','00']+result[1:]
length+=1
result=result[:length]
print(''.join(result)) #include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int n = s.length();
string rst = "";
bool changed = false;
if (n % 2) {
for (int i = 0; i < n + 1; i += 2) {
if (i % 4) {
rst += "00";
} else {
rst += "11";
}
}
} else {
rst = s;
for (int i = 0; i + 1 < n; i += 2) {
if (changed) {
rst[i] = rst[i + 1] = rst[i - 1] == '0'?'1':'0';
} else {
if (rst[i] != rst[i + 1]) {
char c = rst[i] > rst[i + 1] ? rst[i] : rst[i] + 1;
rst[i] = rst[i + 1] = c;
changed = true;
}
if (i >= 2 && rst[i] == rst[i - 2]) {
if (rst[i] == '9'){
if(i>=4){
rst[i-3]+=1;
i-=6;
changed=false;
}else{
rst="110011"+rst.substr(4,n);
n=rst.length();
changed = true;
i=4;
}
}else{
rst[i] = rst[i + 1] = rst[i]+1;
changed = true;
}
}
}
}
}
cout << rst;
}
// 64 位输出请用 printf("%lld") #include <iostream>
#include <vector>
using namespace std;
vector<int> fill(int num, bool flag){
num /= 2;
vector<int> ret;
while(num-- > 0){
if(flag){
ret.emplace_back(1);
ret.emplace_back(1);
}
else{
ret.emplace_back(0);
ret.emplace_back(0);
}
flag = !flag;
}
return ret;
}
int main() {
string str;
cin >> str;
int count = str.size();
vector<int> bit;
for(char c : str){
bit.emplace_back(c - '0');
}
vector<int> output;
if(count % 2 == 1){
output = fill(count + 1, true);
}else{
// for(int x : bit) cout << x; cout << endl;
int idx = 0;
while(idx < count){
if(bit[idx] == bit[idx + 1]){
output.emplace_back(bit[idx]);
output.emplace_back(bit[idx]);
idx += 2;
}else{
int target = bit[idx] * 10 + bit[idx + 1];
for(int i = 0; i < 10; ++i){
if(i * 11 >= target){
output.emplace_back(i);
output.emplace_back(i);
break;
}
}
auto fillVec = fill(count - idx - 2, false);
output.insert(output.end(), fillVec.begin(), fillVec.end());
break;
}
}
// for(int x : output) cout << x; cout << endl;
for(int i = 2; i < count; i += 2){
if(output[i] == output[i - 1]){
// 至少有4个连续的数字存在
bool found = false;
for(int j = i + 1; j >= 0; j -= 2){
++output[j], ++output[j - 1]; // 调整当前4个数的低2位,尝试符合题意
if(j > 2 && output[j] == output[j - 2]){
// 后面的调整可能导致前面连锁调整,因此再次+1
++output[j], ++output[j - 1];
}
if(output[j] >= 10) continue; // 需要高位+1,这些低位被重置
found = true;
int k = 0;
// 重置低位
for(int p = j + 2; p < count; p += 2){
output[p] = output[p - 1] = k;
k = (k + 1) % 2;
}
break;
}
if(!found){
// 无论如何无法在count位内构造,增加位数
// for(int x : output) cout << x; cout << endl;
output = fill(count + 2, true);
break;
}
}
}
}
for(int x : output) cout << x; cout << endl;
return 0;
} package main
import (
"fmt"
"strconv"
)
func find(s string) []int {
n := len(s)
var ans []int
if n%2 == 1 { // 奇数长度
ans = make([]int, n+1)
for i := 1; i <= n; i += 2 {
val := ((i / 2) & 1) ^ 1
ans[i] = val
ans[i-1] = val
}
} else { // 偶数长度
ans = make([]int, n)
for i := 1; i < n; i += 2 {
a, _ := strconv.Atoi(string(s[i-1]))
b, _ := strconv.Atoi(string(s[i]))
if a == b {
ans[i] = a
ans[i-1] = a
} else {
target := a*10 + b
for j := 0; j < 10; j++ {
if j*11 >= target {
ans[i] = j
ans[i-1] = j
break
}
}
k := 0
for j := i + 2; j < n; j += 2 {
ans[j] = k
ans[j-1] = k
k ^= 1
}
break
}
}
for i := 2; i < n; i += 2 {
if ans[i] == ans[i-1] {
found := false
for j := i + 1; j >= 0; j -= 2 {
ans[j] += 1
ans[j-1] += 1
if j > 2 && ans[j] == ans[j-2] {
ans[j] += 1
ans[j-1] += 1
}
if ans[j] < 10 {
found = true
k := 0
for p := j + 2; p < n; p += 2 {
ans[p] = k
ans[p-1] = k
k ^= 1
}
break
}
}
if !found {
ans = make([]int, n+2)
for j := 1; j <= n+1; j += 2 {
val := ((j / 2) & 1) ^ 1
ans[j] = val
ans[j-1] = val
}
return ans
}
}
}
}
return ans
}
func main() {
var x string
fmt.Scan(&x)
result := find(x)
for _, num := range result {
fmt.Print(num)
}
fmt.Println()
}