题目大意:问通过几次操作可将集合的一个n值分为n个值为1的集合,没次操作可分为k份(PS:我理解成每次分成的小份值最大为k了,看了题解才做出来)
解题思路:每次拆分成k-1个1和1个值s-k-1(s为上一个非1zhi),可以得到最多需要 (n-1+k+2)/(k-1) 次(需考虑s-k-1为1的情况)
个人代码:
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n, k;
cin >> n >> k;
int c = (n-1 + k-2)/(k-1); //如果余数为一,不用再次切割
cout << c << endl;
}
int main() {
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
题解代码(Python):
t = (int)(input())
for _ in range(t):
n, k = map(int, input().split())
print((n - 1 + k - 2) // (k - 1))
题目大意:给你一个01序列,问通过相关操作能否得到序列[1]
解题思路:找到连续的0序列消为一个[0]序列,然后判断余下序列中1是否多于0
个人代码:
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n;
cin >> n;
string a;
cin >> a;
int zero, one;
int flag = 0;
zero = one = 0;
for (int i = 0; i < a.size(); i++) {
if (a[i] == '0' && !flag) {
zero++;
flag = 1;
} else if (a[i] == '1') {
flag = 0;
one++;
}
}
if (n == 1) {
zero = one = 0;
if (a[0] == '1') {
one++;
} else {
zero++;
}
}
if (one > zero) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
int main() {
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
题解代码(Python):
t = (int)(input())
for _ in range(t):
n = (int)(input())
a = input()
ok = 0
if a.count("111") >= 1:
ok = 1
if a.count("11") >= 2:
ok = 1
if a.count("11") >= 1 and (a[0] == "1" or a[-1] == "1"):
ok = 1
if a[0] == "1" and a[-1] == "1":
ok = 1
if ok:
print("Yes")
else:
print("No")
C. Increasing Sequence with Fixed OR
题目大意:给一个数字n,问你能否找出一个长度为k的序列满足a[i] | a[i+1] = n (|为逻辑算法中的或)
解题思路:找到n的二进制中的1,按顺序依次将其中的1变为0
题解代码(Python):
t = (int)(input())
for _ in range(t):
n = (int)(input())
a = []
for i in range(62, -1, -1):
x = 1 << i
if ((x & n) == x) and (x != n):
a.append(n - x)
a.append(n)
print(len(a))
for i in a:
print(i, end=" ")
print("")
找到个别人的优秀解析,个人代码就是在此基础上添加注释