B、小红的dfs
思路:一种是使用dfs,另一种思路,根据题意如果要求得最小值,那么只有横向纵向各一个dfs,且这个dfs是相互组成的,那么只有三种情况,直接分情况判断,三种情况特殊行和列的元素是否对最后取最小值就可以了。
#include<bits/stdc++.h>
using namespace std;
int main() {
string a[3];
for (int i = 0; i < 3; i++) cin >> a[i];
int c1 = 0, c2 = 0, c3 = 0;
if (a[0][0] != 'd') c1++;
if (a[0][1] != 'f') c1++;
if (a[0][2] != 's') c1++;
if (a[1][0] != 'f') c1++;
if (a[2][0] != 's') c1++;
if (a[1][0] != 'd') c2++;
if (a[1][1] != 'f') c2++;
if (a[1][2] != 's') c2++;
if (a[0][1] != 'd') c2++;
if (a[2][1] != 's') c2++;
if (a[2][0] != 'd') c3++;
if (a[2][1] != 'f') c3++;
if (a[2][2] != 's') c3++;
if (a[0][2] != 'd') c3++;
if (a[1][2] != 'f') c3++;
int min=c1;
if(min>c2) min=c2;
if(min>c3) min=c3;
printf("%d",min);
return 0;
}
C、小红的排列生成
思路:先读入,再排序,最后根据所在位置与本身差值统计操作次数。(注意数据大小)
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
long long count=0;
for(int i=1;i<=n;i++) count=abs(i-a[i])+count;
cout<<count;
return 0;
}
D、小红的二进制树
思路:dfs,统计不包括在自己在内,有多少个1。
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
int dp[N];
string s;
vector<int>h[N];
void dfs(int u,int fa)//u代表当前点,fa代表父亲
{
dp[u] += s[u]-'0';//直接让dp等于1的数量
for(int i:h[u]){
if(i==fa) continue;
dfs(i,u);//向下走
dp[u] += dp[i];
}
}
int main()
{
cin>>n>>s;
s = ' ' + s;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
h[u].push_back(v);
h[v].push_back(u);
}
dfs(1,0);
for(int i=1;i<=n;i++){
cout<<dp[i]-(s[i]-'0')<<'\n';
}
return 0;
}
E、小红的回文数
思路:有个性质,如果某个区间是好数或者回文数,若长度为偶数,每个数的出现次数为偶数,若长度为奇数,则只有中间的数出现次数为奇数。即:统计区间每个字符出现的次数,最多有一种字符出现次数为奇数则该区间符合条件,能够造出回文数。
#include<bits/stdc++.h>
using namespace std;
map<vector<int>, int>m;
int main()
{
string s;
cin >> s;
int n = s.length();
vector<int>temp;//初始化
for (int i = 0; i < 10; i++)temp.push_back(0);//temp[i],代表i这个数字出现次数
//但这个题只需要记录出现是否为奇数次
//用0代表偶数次,1代表奇数次
m[temp]++;
long long sum = 0;
for (int i = 0; i < n; i++)
{
temp[s[i] - '0'] ^= 1;//异或
sum += m[temp];
for (int j = 0; j < 10; j++)
{
vector<int>tt = temp;
tt[j] ^= 1;
sum += m[tt];
}
m[temp]++;
}
cout<<sum;
}