Codeforces Round #807 (Div. 2)
A. Mark the Photographer
给定整数n,数组长度2*n,问能不能拆成两个长度为n的数组,两个数组的第i项有a[i]>=b[i]+x
思路:暴力
DIFF : 800
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5+100;
int a[N];
int main()
{
int t;
for(cin>>t;t;t--)
{
int n,x;
cin>>n>>x;
for(int i=1;i<=n*2;i++)
{
cin>>a[i];
}
sort(a+1,a+2*n+1);
bool falg=true;
for(int i=1;i<=n;i++)
{
if(a[i+n]-a[i]<x)
{
falg=false;
}
}
if(falg)
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
}
return 0;
}
B. Mark the Dust Sweeper
给出一个数组,每次可以选择从1到n-1的任意一段连续且数值均大于0的区间[l,r],使得a[l]–,a[r]++
,问你需要多少次这样的区间选择才能把从1到n-1的区间全变成0
思路:暴力,发现需要选取的非零区间,所以把从第一个非0数一直到n-1项,遇到0答案加一,遇到非零的数就给答案加上这个数。
#include <iostream>
#define int long long
using namespace std;
const int N = 2e5+100;
int a[N];
signed main()
{
int t;
for(cin>>t;t;t--)
{
int n,sum=0,st=1;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n-1;i++)
{
if(a[i]==0)
{
st=i+1;
}
else
{
break;
}
}
for(int i=st;i<=n-1;i++)
{
if(a[i]==0)
{
sum++;
}
else
{
sum+=a[i];
}
}
cout<<sum<<endl;
}
return 0;
}
C. Mark and His Unfinished Essay
这个题就有点意思了,我们给出一个初始的字符串s,多次选取一段区间复制后拼接到s后方形成新的s,值得注意的是,每次经过复制后我们下一次复制操作是基于新的串s进行的。复制操作完成后,我们输出第k个字符
思路:暴力,每次寻找本下标对应的复制的对象的下标。一直寻找的第一个串。(希望来个高手写个递归做法我看看)
#include <iostream>
#define int long long
using namespace std;
const int N = 2e5+100;
int l[N];
int sum[N];
signed main()
{
int t;
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
for(cin>>t;t;t--)
{
string s;
int n,c,q;
cin>>n>>c>>q;
cin>>s;
sum[0]=n;
for(int i=1,r;i<=c;i++)
{
cin>>l[i]>>r;
sum[i]=sum[i-1]+r-l[i]+1;
}
for(int i=1;i<=q;i++)
{
int num;
cin>>num;
while(num>n)
{
for(int j=1;j<=c;j++)
{
if(sum[j]>=num)
{
num-=sum[j-1];
num+=l[j]-1;
break;
}
}
}
cout<<s[num-1]<<'\n';
}
}
return 0;
}
D. Mark and Lightbulbs
题意:给出一个两个01串,掐头去尾选中间的元素,如果两边的元素不一样,那么就可以改变这个元素(由0到1或相反)
思路:因为改变要求左右不相等,所以直接定死,我们把串压缩,001100变成010这样,如果压缩后两个串一样可以变化,并且答案是不同块的左端下标差的绝对值的和。不一样就无解喽。
#include <iostream>
#define int long long
using namespace std;
const int N = 2e5+100;
int a[N],b[N];
signed main()
{
int t;
for(cin>>t;t;t--)
{
string s,ss;
int n,con1=0,con2=0;
cin>>n;
cin>>s>>ss;
string s1="",ss1="";
s1+=s[0];
ss1+=ss[0];
a[++con1]=0;
b[++con2]=0;
for(int i=1;i<n;i++)
{
if(s[i]!=s[i-1])
{
s1+=s[i];
a[++con1]=i;
}
if(ss[i]!=ss[i-1])
{
ss1+=ss[i];
b[++con2]=i;
}
}
if(s1!=ss1)
{
cout<<-1<<endl;
continue;
}
int ans=0;
for(int i=1;i<=con1;i++)
{
ans+=abs(a[i]-b[i]);
}
cout<<ans<<endl;
}
return 0;
}