A. String
翻译:
给你一个长度为 n 的字符串 s,其中包含 0 和/或 1。在一次操作中,您可以从 s 中选择一个非空的子序列 t,使得 t 中任何两个相邻的字符都是不同的。然后,翻转 t 中的每个字符(0 变为 1,1 变为 0)。例如,如果 ,,操作后,s
变为 。计算将 s 中的所有字符变为 0 所需的最少操作次数。
回想一下,对于字符串 来说,任何满足的字符串 都是 s 的子序列。
思路:
对于字符串s对字符1进行单独反转最赚
实现:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;void solve(){string s;cin>>s;int ans = 0;for (char i:s){ans+=i=='1';}cout<<ans<<endl;
}int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// 不使用科学计数法// cout<<fixed;// 中间填保留几位小数,不填默认// cout.precision();int t;cin>>t;while (t--) solve();
}
B. Clockwork
翻译:
有一串 n 个排成一行的时钟,其中第 i 个时钟的初始时间为 ai。在每一秒钟内,依次发生以下情况:
- 每个时钟的时间减少 1。如果任何时钟的时间为 0,您就会立即输掉。
- 您可以选择移动到邻近的时钟,或者留在当前所在的时钟上。
- 您可以将您所在时钟的时间重置回初始值 。
请注意,上述事件是按顺序发生的。如果某个时钟的时间在某一秒内为 0,即使您可以移动到该时钟并在该秒内重置其时间,您仍然会输。
您可以从任何时钟开始。确定是否有可能无限期地继续这个过程而不会输。
思路:
要让过程永续下去必须要走过每个点,判断是否存在一个点 i 会在以该点为起点,向左来回或向右来回时消失,判断条件为i<=2*max(i-1,n-i)。
实现:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;void solve(){int n; cin>>n;vector<int> a(n+1);for (int i=1;i<=n;i++){cin>>a[i];} for (int i=1;i<=n;i++){if (a[i]<=2*max(i-1,n-i)){cout<<"NO"<<endl;return;}}cout<<"YES"<<endl;
}int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// 不使用科学计数法// cout<<fixed;// 中间填保留几位小数,不填默认// cout.precision();int t;cin>>t;while (t--) solve();
}
C. Cirno and Operations
翻译:
Cirno 有一个长度为 n 的序列 a。除非 a 的当前长度为 1,否则她可以执行以下两个操作中的任意一个(可能是 0 次):
- 逆转序列。形式上,在操作后变成 。
- 用差分序列替换序列。形式上, 在运算后变成 。
求所有运算后 a 的最大可能和。
思路:
dfs(tmp)为当前序列tmp的最大值,tmp可能会有重复计算的情况,使用memo记忆化
实现:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;void solve(){ll n; cin>>n;vector<ll> a(n);for (ll i=0;i<n;i++) cin>>a[i];// 答案 ll ans = LLONG_MIN;// 记忆化map<vector<ll>,ll> memo;// 求当前tmp的和auto dfs = [&](auto&& dfs,vector<ll> tmp)->void{ll ssize = tmp.size();if (ssize==1){ans = max(ans,1ll*tmp[0]);return;}//该状态求过,map对于未定义的int默认为0if (memo[tmp]) return;memo[tmp]=1;// tmp的求和ll now = tmp[0];vector<ll> now_tmp(tmp.begin(),tmp.end());// 反转tmpreverse(tmp.begin(),tmp.end());// a1为tmp反转后的差分数组,a2为tmp的差分数组vector<ll> a1(ssize-1),a2(ssize-1);for (ll i=1;i<ssize;i++){a1[i-1] = tmp[i]-tmp[i-1];a2[i-1] = now_tmp[i]-now_tmp[i-1];now+=now_tmp[i];}// 更新答案ans = max({ans,now,tmp[ssize-1]-tmp[0],tmp[0]-tmp[ssize-1]});dfs(dfs,a1);dfs(dfs,a2);};dfs(dfs,a);cout<<ans<<endl;
}int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// 不使用科学计数法// cout<<fixed;// 中间填保留几位小数,不填默认// cout.precision();ll t;cin>>t;while (t--) solve();
}
bb空间
有建议可以评论,我会积极改进qwq。
话说爬虫前景如何?