C.方豆子
题目链接:C-方豆子_牛客小白月赛75(重现赛)@XuSihan (nowcoder.com)
该题能用循环或者递归去解决,这里用递归,由图可以发现每一级豆子都是由上一级组成,所以从递归到1,n级豆子就会有1 << n - 1 行个一级豆子组成,具体看代码实现
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
string a[10] = {"******","******","******","***...","***...","***..."};
string b[10] = {"......","......","......","...***","...***","...***"};
string ans[N];
void connect1(int x)//好豆
{
for(int i = 0 ; i < 6 ; i ++ )
ans[x + i] += a[i];
}
void connect2(int x)//坏豆
{
for(int i = 0 ; i < 6 ; i ++ )
ans[x + i] += b[i];
}
void dfs(int u , int x , int y) // u表示递归到第几级,x表示1为一级好豆子,0为一级坏豆子,y表示该该豆子需要放置的横坐标
{
if(u == 1)//如果到第一级则在ans字符串后连接一级豆子
{
if(x == 1) connect1(y);
else connect2(y);
return ;
}
//每一级豆子分为四块
//下部分的豆子,上部分有着1 << u - 2 个一级豆子
//所以下半部分的坐标加上 (1 << u - 2) * 6;
dfs(u - 1 , !x , y);
dfs(u - 1 , !x , y);
dfs(u - 1 , !x , y + (1 << u - 2) * 6);//符号<<表示向左移动几位,表示乘以2的几次方
dfs(u - 1 , x , y + (1 << u - 2) * 6);
}
int main()
{
int n;
cin >> n;
dfs(n , 1 , 0);
for(int i = 0 ; i < 1 << n - 1 ; i ++ )
for(int j = 0 ; j < 6 ; j ++ )
cout << ans[i * 6 + j] << endl;
return 0;
}
CF~
B.Maximum Strength
题意:
给定区间 [l, r],你可以选择区间内的任何两个数将他们合为一个数,合并的规则:
将选定出的两个数的十进制中的每一位求差的绝对值,将所有位数的结果加起来就是合并出的数,求最大可以合并出的数。
贪心的考虑:找到 l, r 从最高位开始的第一位不相等的十进制位,r 和 l 的这一位交换,后面的一个全取 9,一个全取 0 即可。
#include <bits/stdc++.h>
using namespace std;
string n, m;
void solve() {
cin >> n >> m;
while(n.size() < m.size()) n = '0' + n;//补0
int pos = n.size();
for(int i = 0; i < n.size(); i ++ )
{
if(n[i] != m[i])
{
pos = i;
swap(n[i], m[i]);//交换数值
break;
}
}
for(int i = pos + 1; i < n.size(); i ++ ) n[i] = '0', m[i] = '9';
int ans = 0;
for(int i = 0; i < n.size(); i ++ ) ans += abs(n[i] - m[i]);
cout << ans << "\n";
}
int main()
{
int t;
cin >> t;
while(t -- )
solve();
return 0;
}
C. Game with Reversing
大意~:A想结束快,B想时间长
A变一个,B翻转一个;
由题意可以发现实际上Bob的操作无法影响到Alice的操作,所以直接计算Alice需要几步使字符串字符类型和数量相同,当Alice完成时,判断另一个数组为正序还是逆序。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, m, k;
string w, s;
void solve()
{
cin >> n;
cin >> w >> s;
ll ans = 1e15;
for(int k = 0; k < 2; k ++)
{
ll res = 0;
for(int i = 0; i < n; i ++)
{
if(w[i] != s[i]) res ++;
}
if(res % 2 == k)
{
// 当Alice操作完成时,若为正序,时间为2res,反正Alice等到Bob的一次操作使其变成正序
ans = min(ans , res * 2);
}
else if(res % 2 != k && res > 0)
{
ans = min(ans , res * 2 - 1);
}
else
{
ans = min(ans, (ll)2);
}
reverse(s.begin(), s.end());
}
cout << ans << endl;
}
int main()
{
int T;
cin >> T;
while(T--)
solve();
return 0;
}