Codeforces Round #753 (Div. 3) A-E
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #753 (Div. 3) A-E相关的知识,希望对你有一定的参考价值。
打的烂的一批。
目录
A. Linear Keyboard【简单 /模拟】
https://codeforces.com/contest/1607/problem/A
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5*2+10;
int n,m,t;
int s[N];
int main(void)
{
int t; cin>>t;
while(t--)
{
string temp; cin>>temp;
string ss; cin>>ss;
for(int i=0;i<temp.size();i++) s[temp[i]-'a']=i+1;
LL ans=0;
for(int i=1;i<ss.size();i++) ans+=abs(s[ss[i]-'a']-s[ss[i-1]-'a']);
cout<<ans<<endl;
}
return 0;
}
B. Odd Grasshopper【简单 / 找规律】
https://codeforces.com/contest/1607/problem/B
四个为一组,一组的和为0。
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL t,x,n;
int main(void)
{
cin>>t;
while(t--)
{
cin>>x>>n;
LL cnt=n%4;
LL len=n/4;
for(LL i=1,j=len*4+1;i<=cnt;i++,j++)
if(x&1) x+=j;
else x-=j;
cout<<x<<endl;
}
return 0;
}
C. Minimum Extraction【一般 / 排序 思维】
https://codeforces.com/contest/1607/problem/C
考试的时候假题了,不过想的方法也是比较垃圾,我是直接用树状数组模拟做的。
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
typedef pair<int,int> PII;
const int N=1e5*2+10;
LL t,n,a[N],tr[N];
LL lowbit(LL x){return x&(-x);}
LL add(LL x,LL v){for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=v;}
LL query(int x)
{
LL sum=0;
for(int i=x;i;i-=lowbit(i)) sum+=tr[i];
return sum;
}
int main(void)
{
cin>>t;
while(t--)
{
cin>>n;
memset(tr,0,sizeof tr);
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
int b=a[i]-a[i-1];
add(i,b);
}
LL ans=query(1);
for(int i=1;i<n;i++)
{
add(i,-query(i));//后面的数都减去该数
ans=max(ans,query(i+1));//取一下当前区间的最小值
}
cout<<ans<<endl;
}
return 0;
}
简洁写法
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int t; cin>>t;
while(t--)
{
int n,x; cin>>n;
vector<int>ve;
for(int i=0;i<n;i++) cin>>x,ve.push_back(x);
sort(ve.begin(),ve.end());
int sum=0,ans=-1e9;
for(int i=0;i<ve.size();i++)
{
ans=max(ans,ve[i]+sum);
sum=sum-(ve[i]+sum);//提供的贡献
}
cout<<ans<<endl;
}
return 0;
}
D. Blue-Red Permutation【一般 思维 / 贪心】
https://codeforces.com/contest/1607/problem/D
将红的放一块,蓝的放一块,分类排序讨论即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int a[N],t,n;
bool cmp(int a,int b) {return a>b;}
int main(void)
{
cin>>t;
while(t--)
{
cin>>n;
vector<int>ve[2];
for(int i=0;i<n;i++) cin>>a[i];
string s; cin>>s;
for(int i=0;i<s.size();i++)
if(s[i]=='B') ve[0].push_back(a[i]);
else ve[1].push_back(a[i]);
sort(ve[0].begin(),ve[0].end());//蓝的从小到大
sort(ve[1].begin(),ve[1].end(),cmp);//红的从大到小
bool flag=1;
for(int i=0,j=1;i<ve[0].size();i++,j++)
if(ve[0][i]<j) flag=0;//蓝只可以减,说明不具备条件
for(int i=0,j=n;i<ve[1].size();i++,j--)
if(ve[1][i]>j) flag=0;//红只可以加,说明无论如何都凑不出来j
if(flag) puts("YES");
else puts("NO");
}
return 0;
}
E. Robot on the Board 1【中 / 模拟 放缩】
https://codeforces.com/contest/1607/problem/E
不是太会,网上看了看别人的代码
#include<bits/stdc++.h>
using namespace std;
int t,n,m;
int L,R,U,D,x,y,a,b;
string s;
int main(void)
{
cin>>t;
while(t--)
{
cin>>n>>m>>s;
a=b=1;
L=1,R=m;
D=1,U=n;
x=y=1;
for(int i=0;i<s.size();i++)
{
if(s[i]=='L') y++;
if(s[i]=='R') y--;
if(s[i]=='D') --x;
if(s[i]=='U') ++x;
L=max(L,y);
D=max(D,x);
R=min(R,y+m-1);
U=min(U,x+n-1);
if(L<=R&&D<=U) a=D,b=L;
}
cout<<a<<" "<<b<<endl;
}
return 0;
}
以上是关于Codeforces Round #753 (Div. 3) A-E的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #753 (Div. 3) ABCD
Codeforces Round #753 (Div. 3) ABCD
Codeforces Round #753 (Div. 3) ABCD
Codeforces Round #753 (Div. 3) A-E