A-D题解
A. Unit Array
题解
只用看一下有多少个1和-1
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=105;
int a[N];
int main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
int n;
>>n;
cinint cnt=0;
for(int i=1;i<=n;i++)
{
>>a[i];
cinif(a[i]==-1)
++;
cnt}
if(cnt<=n/2&&cnt%2==0)
<<0<<'\n';
coutelse
{
if(cnt>n/2)
{
if(n/2%2==0)
<<cnt-n/2<<'\n';
coutelse
<<cnt-n/2+1<<'\n';
cout}
else
{
<<1<<'\n';
cout}
}
}
return 0;
}
B. Maximum Strength
题解
如果
例如88和1914就变成999和1000
显然这样是最大的
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
signed main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
,R;
string L>>L>>R;
cin(L.begin(),L.end());
reversefor(int i=L.length();i<R.length();i++)
+='0';
L(L.begin(),L.end());
reversebool flag=false;
int k=R.length();
for(int i=0;i<R.length();i++)
{
if(L[i]!=R[i])
{
=i;
k=true;
flagbreak;
}
}
if(!flag)
<<0<<'\n';
coutelse
<<abs(R[k]-L[k])+9*(R.length()-1-k)<<'\n';
cout}
return 0;
}
C. Game with Reversing
题解
可以发现翻转对结果是没什么用的,只用算一下两个字符串的距离以及其中一个翻转之后的距离
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int d[2];
int main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
int n;
>>n;
cin(d,0,sizeof(d));
memset,s2;
string s1>>s1>>s2;
cinfor(int i=0;i<n;i++)
{
if(s1[i]!=s2[i])
[0]++;
d}
=s2;
string temp(temp.begin(),temp.end());
reversefor(int i=0;i<n;i++)
{
if(s1[i]!=temp[i])
[1]++;
d}
if(d[0]==0)
<<0<<'\n';
coutelse if(d[1]==0)
<<2<<'\n';
coutelse
<<min(max(0,d[0]%2==1?(2*d[0]-1):2*d[0]),d[1]%2==1?2*d[1]:2*d[1]-1)<<'\n';
cout}
return 0;
}
D. Survey in Class
题解
相当于计算每两个学生的区间的差的最大值
对于每两个区间a和b,a被b交之后有三种情况,一种是留下左边,一种是留下右边,另一种是一个在另一个的中间
对于所有的第一种情况,可以通过先算出maxl简化运算
对于所有的第二种情况,可以通过先算出minr简化运算
对于第三种情况,最大的值只能是最长区间长度减最短区间长度
对于区间完全不相交的情况,其实也是可以遍历到的
最后遍历一遍取最大值就行,复杂度O(n)
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int l[N],r[N],len[N];
int main() {
::sync_with_stdio(false);cin.tie(nullptr);
iosint T;
>>T;
cinwhile(T--)
{
int n,m;
>>n>>m;
cinfor(int i=1;i<=n;i++)
{
>>l[i]>>r[i];
cin[i]=r[i]-l[i]+1;
len}
int maxl=*max_element(l+1,l+1+n);
int minr=*min_element(r+1,r+1+n);
int ans=*max_element(len+1,len+1+n)-*min_element(len+1,len+1+n);
for(int i=1;i<=n;i++)
{
=max(ans,min(r[i]-minr,len[i]));
ans=max(ans,min(len[i],maxl-l[i]));
ans}
<<ans*2<<'\n';
cout}
return 0;
}