A. 小红的字符串生成
如果字母相同,那么只有两种组合a与aa,否则四种排列组合
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
string a,b;
cin>>a>>b;
if(a==b) {
cout<<2<<'\n'<<a<<'\n'<<(a+b)<<'\n';
} else {
cout<<4<<'\n';
cout<<a<<'\n'<<b<<'\n'<<(a+b)<<'\n'<<(b+a)<<'\n';
}
return 0;
}
B. 小红的非排列构造
首先看一下是不是非排列,如果不是的话就不用改了,是的话就把第一个改成一个大于 1 0 5 10^5 105的数
#include <bits/stdc++.h>
using namespace std;
int arr[100010];
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
int n;
bool flag=true;
cin>>n;
for(int i=1;i<=n;i++) {
cin>>arr[i];
}
sort(arr+1,arr+n+1);
for(int i=1;i<=n;i++) {
flag=flag&&arr[i]==i;
}
if(!flag) {
cout<<0<<'\n';
} else {
cout<<1<<'\n'<<"1 1000000"<<'\n';
}
return 0;
}
C. 小红的数字拆解
因为给出的是一个偶数,所以这个数一定能全部分成偶数。用字符串读入,从前往后遍历,如果是偶数就直接存起来,如果是奇数那么存到临时变量中继续找,直到找到一个偶数再把临时变量存起来。最后把存起来的数从小到大排序
#include <bits/stdc++.h>
using namespace std;
typedef pair<string,int> psi;
map<string,int> mp;
bool cmp(psi x,psi y)
{
string a=x.first,b=y.first;
if(a.length()!=b.length()) return a.length()<b.length();
else {
for(int i=0;i<a.length();i++) {
if((a[i]-'0')!=(b[i]-'0')) return (a[i]-'0')<(b[i]-'0');
}
}
return false;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
string number,temp;
cin>>number;
for(int i=0;i<number.length();i++) {
if((number[i]-'0')%2) {
temp+=number[i];
} else {
temp+=number[i];
mp[temp]++;
temp="";
}
}
vector<pair<string,int>> ans;
for(auto [a,b]:mp) {
ans.push_back({a,b});
}
sort(ans.begin(),ans.end(),cmp);
for(auto [a,b]:ans) {
while(b--) {
cout<<a<<'\n';
}
}
return 0;
}
D. 小红的陡峭值
做题的时候迷迷糊糊的,没看清楚题目意思被卡住了,把所有非0数找出来放到一个vector中,判断一下陡峭值res,有以下几种情况:
- 全部是0:直接输出一个符合的数组
- res==0:说明只存在一个数 x,如果原数组中首位都非0则无解,否则将其中任意一个位置改成x+1
- 上面两种排除无解情况之后,从前向后遍历一遍数组,把所有 0 的位置改成前面最近的一个非 0 的数,再从后向前遍历,同样操作。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int arr[100010];
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
int n;
cin>>n;
vector<int>b;
for(int i=1;i<=n;i++) {
cin>>arr[i];
if(arr[i]) b.push_back(arr[i]);
}
if(count(arr+1,arr+n+1,0)==n) {
cout<<1<<' ';
for(int i=1;i<n;i++) cout<<2<<' ';
} else {
ll res=0;
for(int i=1;i<b.size();i++) res+=abs(b[i]-b[i-1]);
if(res>1) {
cout<<-1<<'\n';
} else if(res==0) {
if(arr[1]!=0&&arr[n]!=0) {
cout<<-1<<'\n';
} else {
cout<<(arr[1]==0?b[0]+1:b[0])<<' ';
for(int i=2;i<n;i++) cout<<b[0]<<' ';
cout<<(arr[1]==0?b[0]:b[0]+1);
}
} else {
int last=0;
for(int i=1;i<=n;i++) {
if(arr[i]==0) arr[i]=last;
last=arr[i];
}
last=0;
for(int i=n;i;i--) {
if(arr[i]==0) arr[i]=last;
last=arr[i];
}
for(int i=1;i<=n;i++)
cout<<arr[i]<<' ';
}
}
return 0;
}
E.小红的树形 dp
dfs,但是被我做复杂了,记得特判全是?的情况
#include <bits/stdc++.h>
using namespace std;
int n,d[100010],rt=1;
bool st[100010];
string str;
vector<int> h[100010];
bool succ=true;
char dfs(int u,int from)
{
if(st[u]) return str[u-1];
// cout<<u<<'\n';
for(int i=0;i<h[u].size();i++) {
int j=h[u][i];
if(j==from) continue;
if(str[j-1]=='?'&&str[u-1]!='?') str[j-1]=str[u-1]=='d'?'p':'d';
char res=dfs(j,u);
if(res!='?') {
if(str[u-1]=='?') str[u-1]=(res=='d'?'p':'d');
if(str[u-1]==res) succ=false;
}
}
st[u]=true;
// if(str[u-1]=='?') st[0x3f3f3f3f]=1;
return str[u-1];
}
void eval(int u,int from)
{
for(int i=0;i<h[u].size();i++) {
int j=h[u][i];
if(j==from) continue;
if(str[j-1]=='?') str[j-1]=str[u-1]=='d'?'p':'d';
eval(j,u);
}
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
cin>>n>>str;
for(int i=1;i<n;i++) {
int a,b;
cin>>a>>b;
h[a].push_back(b),h[b].push_back(a);
d[a]++,d[b]++;
}
bool allq=true;
for(int i=0;i<str.length();i++) {
if(str[i]!='?') {
allq=false;break;
}
}
while(d[rt]>2) rt++;
if(allq) str[rt]='d';
dfs(rt,-1);
if(succ) {
eval(rt,-1);
cout<<str<<'\n';
} else {
cout<<-1;
}
return 0;
}
F.小红的矩阵构造
cf原题,参考了大佬的题解
设想将所有行和列的异或和变为1,题目中明确指出 x 为偶数,那么当 x 是 4 的倍数时,可以将 x 除以 4,可以将四个数摆成正方形:
x x
x x
当 x 不是 4 的倍数时,若 x=2 则无解,若 x = 6 的摆法:
1 1 0
0 1 1
1 0 1
若 x > 6,可以从中减出 6 个按上面第二种方式摆在右下角,剩下的按第一种摆在左上角,注意此时 n 与 m 不能同时为 4,不然无法同时摆下这两种形状
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
int n,m,x;
cin>>n>>m>>x;
vector<vector<int>> g(n+1,vector<int>(m+1));
if(x%4==0) {
x/=4;
g[1][1]=g[1][2]=g[2][1]=g[2][2]=x;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cout<<g[i][j]<<" \n"[j==m];
} else {
if(x==2) {
cout<<-1;
} else {
if(x>6&&m==4&&n==4) {
cout<<-1;
} else {
x=(x-6)/4;
g[n][m]=g[n][m-2]=g[n-1][m]=g[n-1][m-1]=g[n-2][m-1]=g[n-2][m-2]=1;
g[1][1]+=x,g[1][2]+=x,g[2][1]+=x,g[2][2]+=x;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cout<<g[i][j]<<" \n"[j==m];
}
}
}
return 0;
}