本蒟蒻的第一篇cf解题报告
题意:
1X1的方块,每一列有不同数量的方块,可以用任意数量的长度为2X1的方块,能否将每一列都变成数量相同;
可以发现进行填充之后每一列都要和最高的那一列同高 可以先找到最大值,如果每一列都要达到最大值数量的方块,就要求每一类和最大值的差值都是2的倍数,如果有一列不是,就不可以达到目标
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
const int inf=0x3f3f3f3f;
int a[maxn];
int main()
{
int T,n,maxs;
cin>>T;
while(T--)
{
scanf("%d",&n);
maxs=-inf;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
maxs=max(maxs,a[i]);
}
int flag=1;
for(int i=1;i<=n;i++)
{
if((maxs-a[i])%2==1)
flag=0;
}
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
题意:在一个序列里是否有长度大于3的回文子串。
1 如果每个元素只出现一次无论怎样也不可能构成回文串;
2 如果一个数出现了3次或者以上,求可以单用这三个数组成一个回文字串,不论位置;
3 如果一个元素出现了两次,如果这两次不是连续出现的,那么就可以通过这两个元素和中间的任意一个元素构成一个回文串
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<map>
using namespace std;
const int maxn=1e6+5;
#define ll long long
inline int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s<='9'&&s>='0'){x=x*10+s-'0';s=getchar();}
return x*f;
}
int a[maxn];
map<int ,int >mp;
int main()
{
int T,n;
cin>>T;
while(T--)
{
int flag=0;
cin>>n;
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=n;i++)
{
mp[a[i]]++;
if(mp[a[i]]==2)
{
if(a[i-1]!=a[i])
flag=1;
}
if(mp[a[i]]>2)
flag=1;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
mp.clear();
}
}
题意:由L和R组成的序列每个代表1个单位,L可以向左走,R可以向右走,每次最多可以走d个单位u,问走0开始走到字符串最后,最大一次跨越距离d的最小值;看到最大距离的最小化,首先想到了二分
可以考虑,想要走到最后,中间的L必须要全部跨过去,因为到了L就必须向左走,必须要跨越一段L,才能走到最后;
所以只需要把最长连续的一段L求出来即可
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<map>
using namespace std;
const int maxn=1e6+5;
const int inf=0x3f3f3f3f;
#define ll long long
inline int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s<='9'&&s>='0'){x=x*10+s-'0';s=getchar();}
return x*f;
}
char a[maxn];
int main()
{
int T;
cin>>T;
getchar();
while(T--)
{
scanf("%s",a);
int len=strlen(a);
//cout<<len<<endl;
int ans=1;
int t=1;
int maxs=-inf;
for(int i=0;i<len;i++)
{
if(a[i]=='L')
t++;
else
{
maxs=max(maxs,t);
t=1;
}
}
maxs=max(maxs,t);
printf("%d\n",maxs);
}
}
计算ai+aj>bi+bj;就是ai-bi+aj-bj>0
计算c[i]=a[i]-b[i],然后对c[i]进行排序,如果满足上述条件的话,应该有c[i]+c[j]=a[i]-b[i]+a[j]-b[j]>0。用两个指针l和r计算配对数即可。本来觉得i<j有顺序的,后来发现并不是,当场暴毙
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<map>
using namespace std;
const int maxn=1e6+5;
const int inf=0x3f3f3f3f;
#define ll long long
inline int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s<='9'&&s>='0'){x=x*10+s-'0';s=getchar();}
return x*f;
}
ll a[maxn],b[maxn],c[maxn];
int main()
{
ll n;
cin>>n;
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=n;i++)
b[i]=read();
for(int i=1;i<=n;i++)
c[i]=a[i]-b[i];
sort(c+1,c+1+n);
int l=1,r=n;
ll ans=0;
while(l!=r)
{
if(c[l]+c[r]>0)
{
ans+=r-l;
r--;
}
else
l++;
}
cout<<ans<<endl;
return 0;
}