Codeforces Round #627 (Div. 3)(CF1324)
题目链接:https://codeforces.com/contest/1324/problems
A - Yet Another Tetris Problem
#include<cstdio>
using namespace std;
int n,t,a[105],flag;
int main()
{
scanf("%d",&t);
while(t--)
{
flag=1;
scanf("%d",&n);
for(register int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(i>1&&(a[i]&1)!=(a[i-1]&1))flag=0;
}
if(flag)printf("YES\n");
else printf("NO\n");
}
return 0;
}
B - Yet Another Palindrome Problem
开始以为要DP,后来发现长度大于3即可,那么直接判断有没有两个不相邻的相同字符就行了。
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn= 5005;
int t,num[maxn],a[maxn],n,flag;
int main()
{
scanf("%d",&t);
while(t--)
{
flag=0;
scanf("%d",&n);
memset(num,0,sizeof(num));
for(register int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
num[a[i]]++;
if((num[a[i]]==2&&a[i-1]!=a[i])||num[a[i]]>2)flag=1;
}
if(flag)printf("YES\n");
else printf("NO\n");
}
}
C - Frog Jumps
并不会往左跳...
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn= 2e5+7;
int t,len,num,maxx;
char s[maxn];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%s",s+1);
len=strlen(s+1);
num=maxx=0;
for(register int i=1;i<=len;i++)
if(s[i]=='R')maxx=max(maxx,num),num=0;
else num++;
maxx=max(maxx,num);
printf("%d\n",maxx+1);
}
}
D - Pair of Topics
之前NOJ邀请赛柏老板出过类似的题目,直接做差排序(或按照差值排序)计数即可。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 2e5+7;
int n,a[maxn],x;
long long ans,orz=1;
int main()
{
scanf("%d",&n);
for(register int i=1;i<=n;i++)scanf("%d",&a[i]);
for(register int i=1;i<=n;i++)scanf("%d",&x),a[i]-=x;
sort(a+1,a+n+1);
bool flag=true;
x=upper_bound(a+1,a+n+1,0)-a;
ans+=1ll*(n-x)*(n-x+1)/2;
int l=x-1,r=x;
while(l>0&&r<=n)
{
if(a[l]+a[r]<=0)r++;
else l--,ans+=n-r+1;
}
printf("%lld",ans);
return 0;
}
E - Sleeping Schedule
DP即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define check(x) (x>=l&&x<=r)
using namespace std;
const int maxn = 2005;
int n,h,l,r,a[maxn],dp[maxn][maxn],ans;
int main()
{
scanf("%d%d%d%d",&n,&h,&l,&r);
for(register int i=1;i<=n;i++)scanf("%d",&a[i]);
memset(dp,-1,sizeof(dp));dp[0][0]=0;
for(register int i=1;i<=n;i++)
for(register int j=0;j<h;j++)
if(dp[i-1][j]!=-1)
ans=max(ans,dp[i][(j+a[i])%h]=max(dp[i][(j+a[i])%h],dp[i-1][j]+check((j+a[i])%h))),
ans=max(ans,dp[i][(j+a[i]-1)%h]=max(dp[i][(j+a[i]-1)%h],dp[i-1][j]+check((j+a[i]-1)%h)));
printf("%d",ans);
return 0;
}