暑假训练第三周第一天

题意:
B:CodeForces 1238D:给你一个只包含AB的字符串,问你有多少个回文子字符串。
C:CodeForces 1238A:两数之差是否能分解成一个素数的若干倍。
D:CodeForces 1238C:在h的高度(此处有踏板),character只能跳一层楼或者两层楼,每在一个h高度时,可以按动lever,使得本层踏板收回,下一层的踏板会改变状态(缩进去会伸进去,伸进去的会出来)。如果跳超过两层,可以用魔法使一层改变状态。求最少要用多少次。
E:CodeForces 1238E:一串字母字符串,给一个整数m表示前m个字母,求打出字符串最少要移动手指多少个单位。假设要打abca 而m序列为abc。m的顺序可以改变。
F:CodeForces 1238B:从1往后,有n个怪物分布在一些位置,每次扔炸弹可以把仍炸弹的当前位置之前的怪物向前炸r个单位,炸弹爆炸位置直接炸死怪物。
补题:
B:思路:逆向思维。题目要求含有长度大于1的回文串即为好的字符串,而且字符串中只有A,B两个字母,所以只有AAAAB或者BAAAA或者ABBBB或者BBBBA这种形式字符串是非好的,其他的字串都是好的。所以求出这些字符串的数量即可。
代码:

#include <bits/stdc++.h>
using namespace std;
char s[1000010];
int main()
{
    long long n,cnt=0,last=0,ans=0;
   cin>>n;
    cin>>s;
    for(int i=0;i<n;i++)
    {
        if(i&&s[i]!=s[i-1])
        {
            ans+=cnt;
            cnt=0;
            last=i;
        }
        else if(last)
        {
            ans++;
        }
        cnt++;
    }
    long long sum=n*(n-1)/2;
    cout<<sum-ans<<endl;
}

D:思路:1.如果x-2高度处有挡板,那么我们在x处按动开关,x和x-1高度处的挡板都收起,小人恰好落在x-2高度处的挡板。
2.如果x-2高度处没有挡板,所以我们用魔法,让x-1高度处的挡板收起来。
注:人在的位置为a[i]-1;
代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[200010],q;
int main()
{
    cin>>q;
    while(q--)
    {
        int h,n;
        cin>>h>>n;
        for(int i=0;i<n;i++)
            a[i]=0;
        for(int i=0; i<n; i++)
           cin>>a[i];
        a[n]=0;
        int ans=0;
           for(int i=1; i<n; i++)
        {///判断i+1和i是否相邻
            if(a[i+1]+1==a[i])
                i++;///相邻  就跳到i+2
            else
                ans++;///不相邻  就用掉一个magic 跳到i+1;
        }
        cout<<ans<<endl;
    }
}

F:思路:先排序,再二分。判断左边数第n−mid个怪物能否在mid次导弹下被炸到陷阱里。
代码:

#include <bits/stdc++.h>
using namespace std;
int wz[100010],v[100010]={0},t,n,r,tip,tmp,ans;
int main()
{
    tip=1;
    ans=0;
    cin>>t;
    while(t--)
    {
        tip=1;
        ans=0;
        cin>>n>>r;
        for(int i=1; i<=n; i++)
        {
            cin>>tmp;
            if(v[tmp]==0)
            {
                v[tmp]=1;
                wz[tip]=tmp;
                tip++;
            }
        }
        sort(wz+1,wz+tip);
        tip-=1;
        for(int i=1; i<=tip; i++)
            if(wz[tip-i]<=r*i)
            {
                ans=i;
                break;
            }
        cout<<ans<<endl;
        for(int i=1;i<=n;i++)
            v[wz[i]]=0;
    }
}

感受:D题题目理解错了,以为开关管的是全部,对着样例模拟了半天。F题,memset函数超时了,说实话,调的时候有点懵,搞得我D题都不敢用memset初始化数组了。剩下的时间都磕在B上了,这题也是花太多时间在题目上,good string的定义在第一行,没注意,虽然看懂之和也还是没弄出来,哎。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值