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