HRBU_20211103训练

A - Linear Keyboard

题意:

给定你一个字符串s的顺序,每一个字符所在的下标位置就是这个字符的值,然后再给定一个字符串ch,需要你将两个相邻的字符的值相减取绝对值后进行一个累加,最后问这个字符串ch的值是多少?

做法:

暴力跑就完事了!时间复杂度非常支持的呢!给字符串ch每一个字符直接赋值,然后相邻的相减,最后结果累和,然后 AC

#include<bits/stdc++.h>
#define int long long
typedef long long ll;
using namespace std;
const int mod=1e9+7;
const int maxn=2e5+10;
int n,a[maxn];
signed main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        string s,s1;
        int num[50],ans=0;
        cin>>s>>s1;
        for(int i=0;i<s1.size();i++)
        {
            for(int j=0;j<26;j++)
            {
                if(s[j]==s1[i])
                    num[i]=j+1;
            }
        }
        for(int i=0;i<s1.size()-1;i++)
            ans+=abs(num[i+1]-num[i]);
        cout<<ans<<endl;
    }
    return 0;
}

B - Odd Grasshopper

题意:

一只蚂蚱(又叫蚱蜢)在一个数轴上蹦跶,它比较特别,当它是从奇数位置起跳时,它的下一次落地位置为当前位置的右边;当它是从偶数位置起跳时,它的下一次落地位置为当前位置的左边它每次跳动的距离就是当前的时间,例如第1秒,它就是跳动距离为1,第2秒,它就是跳动距离为2。以此类推,问当起始位置为x0时经过n秒后这只蚂蚱在哪个位置?

做法:

不多说直接上图
在这里插入图片描述
蓝色为前4秒的运动轨迹,红色为后4秒的运动轨迹。很明显,我们能发现一个规律:4次为一循环。所以这个跳动过程就是一个规律运动过程。只需要讨论四种情况:1、当n%4 ==0时,这表示刚刚好是回到了原点,直接输出x0就行。2、当n%4 ==1时,这表示向右多运动一次,位置即是x0+运动的回合数4+1。3、当n%4 ==2时,这表示去了右边一次又去了左边一次,位置即是x0-1。4、当n%4 ==3时,表示这是回原点前最后一次运动也是运动的最远的一个点,就是x0-运动的回合数4-4。以上就是奇数位置出发的运动情况。偶数位置的取反就ok了。

#include<bits/stdc++.h>
#define int long long
typedef long long ll;
using namespace std;
const int mod=1e9+7;
const int maxn=2e5+10;
int n,a[maxn];
signed main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        ll x0,n;
        cin>>x0>>n;
        if(x0%2!=0)
        {
            ll cnt=n/4,tmp=n%4;
            if(tmp==0)
                cout<<x0<<endl;
            else if(tmp==1)
                cout<<x0+cnt*4+1<<endl;
            else if(tmp==2)
                cout<<x0-1<<endl;
            else
                cout<<x0-cnt*4-4<<endl;
        }
        else
        {
            ll cnt=n/4,tmp=n%4;
            if(tmp==0)
                cout<<x0<<endl;
            else if(tmp==1)
                cout<<x0-cnt*4-1<<endl;
            else if(tmp==2)
                cout<<x0+1<<endl;
            else
                cout<<x0+cnt*4+4<<endl;
        }
    }
    return 0;
}

C - Minimum Extraction

题意:

给定一个数组,每一次你都进行一次减法操作,提出数组中最小的数据,然后让每一个数据都减去这个最小值,获得一个新的数组;一直重复操作直到数组长度为1,问这个期间每一次数组的最小值中的最大值是多少?

做法:

简单的贪心暴力。试想一下,你要求的是每一次变化数组中的最小值,而你每一次操作都是减去最小值,那么给数组排个序(由小到大)然后每一个数据两两相减的差值,这正好就是题目中要求的每一次数组中的最小值不是吗?然后把这个值与第一个值(原数组中的最小值)进行对比,最后输出结果Thanks♪(・ω・)ノ,恭喜 AC

#include<bits/stdc++.h>
#define int long long
typedef long long ll;
using namespace std;
const int mod=1e9+7;
const int maxn=2e5+10;
int n,a[maxn];
signed main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        sort(a+1,a+1+n);
        if(n==1)
        {
            cout<<a[1]<<endl;
            continue;
        }
        int ans=-0x3f3f3f3f;
        for(int i=2;i<=n;i++)
            ans=max(ans,max(a[1],a[i]-a[i-1]));
        cout<<ans<<endl;
    }
    return 0;
}

D - Blue-Red Permutation

题意:

给定了一个数组,然后给定一个字符串,字符串中只包含两种字符:‘R’和‘B’,R表示进行一次+1操作,B则表示进行一次-1操作 R表示可以增加任意数字,B表示可以减少任意数字,位置固定,问你是否可以通过以上字符串规定的操作使数组成为一个1~n的排列呢?1 ~n的排列是个什么概念呢?比如[1,2,3]的排列有:[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]。换句话说就是要求你把这个数组里面的数字变成1 ~n中的数字且不能重复。

做法:

具体思路今天还木得!让孩子明天再补好吗QAQ 纯纯的傻子,直接读错题意。贪心题,我们要做的只需要把字符串中B对应的数字放到一起,判断里面是否有小于对应位置的数字有一个都不行;相反的R对应的数字放在一起,判断里面是否有大于对应位置的数字有一个都不行。否则就是可以的。

#include<bits/stdc++.h>
#define int long long
typedef long long ll;
using namespace std;
const int mod=1e9+7;
const int maxn=2e5+10;
int n,a[maxn];
bool cmp(int x,int y)
{
    return x>y;
}
signed main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        vector<int> R,B;
        string s;
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>a[i];
        cin>>s;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]=='R')
                R.push_back(a[i]);
            else
                B.push_back(a[i]);
        }
        sort(R.begin(),R.end(),cmp);
        sort(B.begin(),B.end());
        int tmp=1,flag=1;
        for(int i=0;i<B.size();i++)
        {
            if(B[i]>=tmp)
                tmp++;
            else
            {
                flag=0;
                break;
            }
        }
        tmp=n;
        for(int i=0;i<R.size();i++)
        {
            if(R[i]<=tmp)
                tmp--;
            else
            {
                flag=0;
                break;
            }
        }
        if(flag)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;
}
/**
BRBR 1 2 5 2
B:1 5 √
R:2 2
*/

E - Robot on the Board 1

题意:

给定一个棋盘,大小为n×m,上面有一个机器人,他可以上(U)下(D)左(L)右®的移动,当机器人越过边界时(假设机器人的位置为(x,y),当x<0||x>n||y<0||y>m,这就是越界的情况),他就会掉落,问给定了机器人的操作指令,机器人要从哪个位置开始运动才能尽可能的完成操作指令?

思路:

模拟就能过,但是具体我到现在还码不出来,总觉得自己有一丝丝漏洞,不知为啥?

今日小结

小做一份Python作业,感觉还可以,上课一如既往的划水摸鱼,感谢俊神的指点以及刘队的讲解题目不然自己啥事都干不成。天天开心呀!OMO

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值