又迟到了
A.小彩找数
直接暴力找或者存对应下表都可以。
void solve(){
vector<int> pos(4);
for (int i = 1;i <= 3;i ++) {
int x;cin >> x;
pos[x] = i;
}
for (int i = 1;i <= 3;i ++) cout << pos[i] << " \n"[i==3];
}
B.小彩的好字符串
考虑暴力枚举每个子串,对于每个子串相较于上一个子串一定只多了一个字符,所以根据前一个字符串统计结果继续统计即可。
void solve(){
int n;cin >> n;
string s;cin >> s;
int ans = 0;
for(int i = 0;i < n;i ++){
int c1 = 0,c2 = 0,c3 = 0;
for (int j = i;j < n;j ++){
if (s[j] == '1') c1 ++;
if (s[j] == '2') c2 ++;
if (s[j] == '3') c3 ++;
if (c1 == c2 && c2 == c3) ans ++;
}
}
cout << ans << "\n";
}
C.小彩的字符串交换
首先,无解的情况一定是不存在 任意一个字符。
那么我们考虑是否存在子串都有 ,如果存在则为
,否则为
。
void solve(){
int n;cin >> n;
string s;cin >> s;
bool res = 1;
res = res & (ranges::find(s,'1') != s.end());
res = res & (ranges::find(s,'2') != s.end());
res = res & (ranges::find(s,'3') != s.end());
if (!res) return void(cout << -1 << "\n");
for (int i = 0;i < n-2;i ++){
int st = 0;
for (int j = i;j < i + 3;j ++){
if (s[j] == '1') st |= 1;
if (s[j] == '2') st |= 2;
if (s[j] == '3') st |= 4;
}
if (st == 7) {
cout << 0 << "\n";
return;
}
}
cout << 1 << "\n";
}
D.小彩的数组选数
考虑动态规划,记录 表示第
位数字取和不取下的最大总和,每次从
项转移。那么就能在线性时间内完成求解。
void solve(){
int n;cin >> n;
vector<int> a(n+1);
for (int i = 1;i <= n;i ++){
cin >> a[i];
}
vector<vector<int>> dp(2,vector<int>(n+1));
for (int i = 1;i <= n;i ++){
dp[0][i] = max(dp[1][i-1],dp[0][i-1]);
dp[1][i] = max(dp[0][i-1] + a[i],dp[0][i]);
}
cout << dp[1][n] << "\n";
}
E.小彩的数组构造
首先我们可以确认数组长度为 ,因为任何正整数都可以被
整除。
只要保证 且
即可有解。
提供一种构造方案,一开始全部为 ,然后给前
个数字
,给前
个数字
,剩下的部分只要保证不被对应数字整除即可,可以枚举对应的数字。
void solve(){
int a,b,c;
cin >> a >> b >> c;
int n = a + 2;
if (b > a || c > a){
cout << -1 << "\n";
return;
}
cout << n << '\n';
vector<int> s(n+1,1);
for (int i = 1;i <= b+2;i ++) s[i] *= 2;
for (int i = 1;i <= c+2;i ++) s[i] *= 3;
for (int i = b+3;i <= n;i ++){
while((s[i] + s[i-1] + s[i-2])%2 == 0) s[i] += 3;
}
for (int i = c+3;i <= n;i ++){
while((s[i] + s[i-1] + s[i-2])%3 == 0) s[i] += 2;
}
for (int i = 1;i <= n;i ++){
cout << s[i] << " \n"[i==n];
}
}
F.小彩的好数构造
首先长度为 是无解的,因为最多乘积为两位数。
那么剩下考虑和 乘积,这样可以保证尽可能保留原来的
和
,且进位不存在或不会很多。
那么列出来的竖式,存在最后一位与第一位相加,那么就可以构造出 (
为偶数),
(
)
void solve(){
int n;
cin >> n;
if (n == 1) return void(cout << -1 << '\n');
for (int i = 1;i <= n;i ++) cout << "01"[i==1||i==n];
cout << " ";
for (int i = 1;i <= n;i ++) cout << "123"[i%2 ? 0 : 1 + (n&1)];
cout << '\n';
}