A. Three Strings(思维)
-
题意: 给三个相同长度 n 字符串 a,b,c,c 每个字符必须和 a 或者 b 的相应下标字符交换,问经过 n 次变换后 a 是否可以和 b 相同。
-
思路: a 的字符与 c 的相同或者 b 的字符与 c 的相同既符合交换。如果三个字符都相同也是一样的,交换后还是 a 和 b 还是相同。
Code:
#include <iostream>
using namespace std;
typedef long long ll;
int main(){
int t; cin>>t;
while(t--){
string a,b,c; cin>>a>>b>>c;
ll len=a.length();
int flag=1;
for(int i=0;i<len;i++){
if(a[i]==c[i] || b[i]==c[i])
continue;
else{
flag=0;
break;
}
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
B. Motarack’s Birthday(思维)
- 题意: 给一个长度为 n 的数组,-1 代表没有数,你需把空位补上相同的 k ,使得数组相邻元素中的最大的差值的绝对值最小。
- 思路: 先找出旁边有空位的数的最大值和最小值,然后取中间值作为 k,将空位全部补上,遍历一遍数组,输出最大的差值的绝对值。
Code:
#include <iostream>
#include <cstring>
#include <cmath>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N=1e5+10;
int a[N];
int main(){
int t; cin>>t;
while(t--){
memset(a,0,sizeof(a));
int n; cin>>n;
int maxn=0,minn=inf,flag=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]!=-1) flag=1;
}
for(int i=1;i<=n;i++){
if(a[i]!=-1 && (a[i-1]==-1 || a[i+1]==-1)){
maxn=max(maxn,a[i]);
minn=min(minn,a[i]);
}
}
if(!flag){
cout<<0<<' '<<0<<endl;
continue;
}
int mid=(maxn+minn)/2;
for(int i=1;i<=n;i++){
if(a[i]==-1)
a[i]=mid;
}
int ans=0;
for(int i=2;i<=n;i++)
ans=max(ans,(int)abs(a[i]-a[i-1]));
cout<<ans<<' '<<mid<<endl;
}
return 0;
}
C. Ayoub’s function(思维)
-
题意: 给长度 n ,m 个 1,构造出一个含 1 子串数量最大的字符串,求最多的含 1 子串数量。
-
思路:
- 用子串总数量减掉不含 1 子串数量即为含 1 子串数量。一个字符串子串数量为 n*(1+n) / 2。
- m 个 1 把 n-m 个 0 分割成 m+1 部分,要使得含 1 子串数量最多,就得将 0 平均分给这 m+1 部分。a = (n-m) / (m+1)就是平均每份 0 的数量,剩下的 b = (n-m)%(m+1) 就在 m+1 份放个 1 。没放 1 的部分就有 m+1-b 份。
- 放 1 部分不含 0 的子串数量有 b*(a+2)*(a+1)/2 ,不放 1 部分不含 0 的子串数量有 c(1+a)a/2。
Code:
#include <iostream>
using namespace std;
typedef long long ll;
int main(){
int t; cin>>t;
while(t--){
ll n,m; cin>>n>>m;
ll a = (n-m)/(m+1);
ll b = (n-m)%(m+1);
ll c = m+1-b;
cout<<(1+n)*n/2-b*(a+2)*(a+1)/2-c*(1+a)*a/2<<endl;
}
return 0;
}