目录
前言
尽量每场都想讲,让cf不怎么玄学
传送门 :
A. Linear Keyboard
给你下标,让你映射,然后输出 ∑ i = 2 n h a s h [ i ] − h a s h [ i − 1 ] \sum _{i=2}^{n} hash[i]-hash[i-1] ∑i=2nhash[i]−hash[i−1]
反思 :
其实当我写完 A题的时候, 已经过了4000多人了,这实在是慢很多
虽然看题是一方面,但是其实 是我多考虑了 那个数组下标 为负数的情况
其实是不会出现的
CODE
void solve()
{
string s;cin>>s;
int len = s.size();
for(int i= 0 ;i<len;i++)
a[s[i]-'a'] = i ;
int sum = 0 ;
cin>>s;
len = s.size();
for(int i =1 ;i<len;i++)
{
sum+=abs(a[s[i]-'a'] - a[s[i-1]-'a']);
}
cout<<sum<<endl;
}
B. Odd Grasshopper
每四个 就会回到起点,根据这个性质,枚举增量
(数学证明不怎么会)
CODE
void solve()
{
int x,n;
cin>>x>>n;
int now = 1;
now = n/4 * 4 +1;
while(now > n )
now -=4;
while(now <= n)
{
if(x&1)
x+=now;
else
x-=now;
now++;
}
cout<<x<<endl;
}
C.Minimum Extraction
感觉C比B简单很多
既然每次都是最小的,那么我们排一个序
然后再累加最小值当作总增量,然后在计算答案即可
但是呢,因为增量都是一样的,所以我们可以直接计算他们之间的差值
CODE
void solve()
{
cin>>n;
if(n == 1)
{
int x;cin>>x;
cout<<x<<endl;
return;
}
for(int i=1;i<=n;i++)
cin>>c[i];
sort(c+1,c+1+n);
int ans = c[1] ;
for(int i=2;i<=n;i++)
ans = max(ans,c[i]-c[i-1]);
cout<<ans<<endl;
}
D.Blue-Red Permutation
分红色和蓝色处理
如果蓝色中出现了,当前小于他小标的数,我们就无法通过操作让他变回去,因为只能变成比他小的数
红色反之同理
CODE
void solve()
{
int n;cin>>n;
for(int i=1;i<=n;i++)
{
cin>>num[i].l;
}
string s;
cin>>s;
for(int i=0;i<n;i++)
{
num[i+1].r = (int)s[i];
}
sort(num+1,num+1+n);
int f = 1;
for(int i=1;i<=n;i++)
{
if(num[i].r =='B' && num[i].l <i)
{
f = 0;
break;
}
if(num[i].r =='R' && num[i].l >i){
f = 0;
break;
}
}
if(f)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
E. Robot on the Board 1
题目看错了,想歪了,如果走掉了那么就走掉了QAQ
对于这题,我们只需要每次能走的最大上下限,和左右限
然后再增加 变量即可
感觉后面几题 都比 B B B 简单 QAQ
CODE
void solve()
{
int r,c;cin>>r>>c;
string s;cin>>s;
int mn = 0 ,cur = 0 ;
int mx = 0 ;
for(auto x : s)
{
if(mx -mn +1 == r)
break;
if(x == 'U')
cur--;
if(x == 'D')
cur++;
mn = min(mn,cur);
mx = max(mx,cur);
}
cout<<1-mn<<" ";
mn = 0 ,mx = 0 ,cur = 0;
for(auto x : s)
{
if(mx -mn+1 == c)
break;
if(x == 'L')
cur--;
if(x == 'R')
cur++;
mn = min(mn,cur);
mx = max(mx,cur);
}
cout<<1-mn<<endl;
}