2019 ACM训练计划——( 每天5题 ) 训练计划⑩
发布日期:2021-06-29 14:25:46 浏览次数:3 分类:技术文章

本文共 2871 字,大约阅读时间需要 9 分钟。

A


题目大意

说来说去,其实就是求CCPC的个数


题解

思维题,其实个人觉得有点难度,首先先遍历一遍,找到CCPC有几个,然后我们把CP给掐掉 对,掐掉"CP" 然后有几个特别情况 “CCC” “CPC” “CCP” 这些都是可以通过增加一个字符 获得CCPC的

#include
using namespace std;const int maxn=2e5+10;char s[maxn];int t,n;int main(){
ios::sync_with_stdio(false); cin.tie(0); cin>>t; while(t--){
cin>>n; cin>>s; int ans=0; for(int i=0;i

B


题目大意

有三种颜色,两个不同的颜色可以合并,问最后怎么合,能让最后剩余的球球最少


题解

引入一个概念:三种颜色分别用0,1,2表示。题意所示合并方式即01合并等于2,02合并等于1,12合并等于0。该合并方式可以用公式表示:

0 ^ 1 ^ 3 = 2
0 ^2 ^ 3 = 1
1 ^2 ^ 3 = 0

特殊情况就是全部都是同一个颜色,此时直接特殊处理输出长度即可

另外,需要进行奇偶划分,奇数个起初就和0异或就好了

对于偶数的话,要与3进行异或

关于相关证明可以参考:https://blog.csdn.net/u013368721/article/details/78763599

#include
using namespace std;const int maxn=5e3+10;char s[maxn];int n;int main(){
ios::sync_with_stdio(false); cin.tie(0); while(cin>>s){
n=strlen(s); set
st; for(int i=0;i

C


题目大意

小明挖矿只能往右或者往下走,如果遇到障碍了就需要一个传送门传送


题解

我们只需要判断每个金币点的右边和下边是否已经是障碍物,如果都是障碍物的话,那小明肯定就不能继续工作了,此时就需要一个传送门

我们可以初始化地图全为障碍物,就可以直接判断金币点的下方和右方了

#include
using namespace std;const int maxn=1000+10;char mp[maxn][maxn];int n,m;int main(){
ios::sync_with_stdio(false); cin.tie(0); while(cin>>n>>m){
memset(mp,'#',sizeof(mp)); for(int i=1;i<=n;i++) cin>>mp[i]+1; int ans=0,cnt=0; for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mp[i][j]=='.'){
++cnt; if(mp[i+1][j]!='.'&&mp[i][j+1]!='.') ++ans; } } } if(cnt<=1) cout<<0<

D


题目大意

让两个土堆最后相同,问最少需要多少体力


题解

当然能不移动是最好的,要移动的话也得要从相邻的移过去

我们可以用当前第一堆先减去第二堆 算出一个差值,这个差值就是相邻堆需要给的(如果差值为负值的话) 如果差值为正值的话,我们就给到下一堆 为下下堆而作准备

#include
using namespace std;const int maxn=1e5+10;int a[maxn],t,n;typedef long long ll;int main(){
ios::sync_with_stdio(false); cin.tie(0); cin>>t; while(t--){
cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++){
int x; cin>>x; a[i]-=x; } ll ans=0; for(int i=1;i<=n;i++){
ans+=abs(a[i]); a[i+1]+=a[i]; } cout<
<

E


题目大意

 给你v,l,n,m代表有v个速度,下一行分别给出v个速度,l长的路,n个随机地点随机改变速度的加油站,m个随机地点宝藏。问拿到所有宝藏的时间期望


题解

因为所有东西几乎随机的,所以我们可以求平均路程和平均速度,然后用平均路径除以平均速度就可以得到时间了 平均速度很好求,但是路径的话注意一下:

有m个随机宝藏 可以将路径分成(m+1)个地点 但是我们从一端走过去的话,并不需要把(m+1)个点全部走完 我们只需要走m个即可 即总长度*( m / ( m + 1 ) ) 最后用doule存一下即可

#include
using namespace std;int v,s,n,m;typedef long long ll;int main(){
while(cin>>v>>s>>n>>m){
double vv=0.0; for(int i=1;i<=v;i++){
int x; cin>>x; vv+=x; } vv/=v; double ss=s*(m*1.0/(m+1)); printf("%.10f\n",ss/vv); } return 0;}
学如逆水行舟,不进则退

转载地址:https://chocolate.blog.csdn.net/article/details/101417699 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:2019 ACM训练计划——( 每天5题 ) 训练计划 11
下一篇:2019 ACM训练计划——( 每天5题 ) 训练计划⑨

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月29日 01时03分58秒