Educational_round94题解
Educational_round94题解
A. String Similarity(构造+思维)
解题思路
原字符串长度为2*n-1,需要匹配的字符串一共有n个,要使所有字符串都得到匹配,即让构造的长度为n的字符串每一个位置都能匹配到一个。可得到w[i]=s[2i]
题解
#include<iostream>
using namespace std;
char str[200];
char ans[200];
int main(){
int T;
cin >> T;
while(T--){
int n;
cin >> n;
cin >> str;
for(int i=0;i<n;i++){
ans[i] = str[i*2];
}
ans[n] = '\0';
cout << ans << "\n";
}
}
B. RPG Protagonist(模拟+贪心)
解题思路
首先记大的为s,小的为w。然后考虑p,从小的w开始拿,依次遍历能拿的所有情况。找出最大值即可。(记得开long\ long)
题解
#include<iostream>
#include<math.h>
using namespace std;
int main(){
int T;
cin >> T;
long long p,f,cnt_s,cnt_w,s,w;
while(T--){
cin >> p >> f;
cin >> cnt_s>> cnt_w;
cin >> s>> w;
if(s<w){
swap(s,w);
swap(cnt_s,cnt_w);
}
long long ans = 0;
for(int i=min(cnt_w,p/w);i>=0;i--){
long long a = min((p-i*w)/s,cnt_s);//p剩余要拿的s
long long cnt_w_t = cnt_w-i;
long long cnt_s_t = cnt_s-a;
long long b = f - min(cnt_w_t*w,f/w*w);//f拿剩余的
long long t = max(b-b/s*s,b-cnt_s_t*s);
ans = max(i+a+(f-b)/w+(b-t)/s,ans);
}
cout << ans << "\n";
}
}
C. Binary String Reconstruction(模拟)
解题思路
就是一个反推字符串的过程。已知有一种情况是两个条件都为假时才会出现0,则先利用这种情况反推出有0的部分。但是这并不是唯一的一种情况,当i-x跟i+x都不在范围内的时候也为0,即在[x,n-x]区间中的字符都为0。其余情况为1。一共扫两遍,第一遍确定0,第二遍判断是否合理
题解
#include<bits/stdc++.h>
using namespace std;
char str[100010];
char ans[100010];
int main(){
int t;
int x;
cin >> t;
while(t--){
cin >> str + 1;
cin >> x;
int n = strlen(str+1);
for(int i=1;i<=n;i++){
ans[i] = '1';
if(i+x>n&&i<=x){
ans[i] = '0';
}
}
for(int i=1;i<=n;i++){
if(str[i]=='0'){
if(i+x<=n){
ans[i+x] = '0';
}
if(i>x){
ans[i-x] = '0';
}
}
}
ans[n+1] = '\0';
bool flag = true;
for(int i=1;i<=n;i++){
if(!(str[i]=='1' && ((i+x<=n&&ans[i+x]=='1') || (i>=x&&ans[i-x]=='1'))
|| (str[i]=='0' && ( (i+x>n && i<x) || !((i+x<=n&&ans[i+x]=='1') || (i>=x&&ans[i-x]=='1')) ) )
)){
flag = false;
}
}
if(flag){
cout << ans+1 <<"\n";
}else{
cout << "-1" << "\n";
}
}
}