A.Yet Another Tetris Problem
题目链接
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<map>
#include<vector>
#define ll long long
using namespace std;
const int maxn=100+10;
int a[maxn];
int n;
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
int maxx=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
maxx=max(maxx,a[i]);
}
bool flag=true;
for(int i=1;i<=n;i++)
{
if((maxx-a[i])%2!=0)
flag=false;
}
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
B.Yet Another Palindrome Problem
题目链接
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<map>
#include<vector>
#define ll long long
using namespace std;
const int maxn=5000+10;
int a[maxn];
int n;
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i];
int flag=false;
for(int i=1; i<=n; i++)
{
int u=a[i];
for(int j=i+2; j<=n; j++)
if(a[i]==a[j])
{
flag=1;
break;
}
if(flag) break;
}
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
C.Frog Jumps
题目链接
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<map>
#include<vector>
#define ll long long
using namespace std;
const int maxn=5000+10;
int a[maxn];
int n;
int main()
{
int t;
cin>>t;
while(t--)
{
string str;
cin>>str;
int ans=0;
int sum=0;
str+="R";
for(int i=0;i<str.length();i++)
{
if(str[i]=='L')
{
sum++;
}
else
{
ans=max(ans,sum);
sum=0;
}
}
cout<<ans+1<<endl;
}
}
D.Pair of Topics
题目链接
题目大意:给你N个ai 和N和bi 一一对应的,然后问你有多少对是满足 ai+bi>aj+bj
思路:想到了二分,但不太一样的是我们在变换上述不等式的时候得到的是 ai-bi>-(aj-bj)
所以我们要对他们的差,做一个负的从大到小的排序,然后二分就行了
同学用树状数组做的,
没开longlong WA4发,我还以为是有段时间没写二分写错了,疯狂改,
我可太难了。。。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<map>
#include<vector>
#define ll long long
using namespace std;
const int maxn=2e5+10;
const int inf=1e9+15;
ll a[maxn];
int n;
int judge(int l,ll k)
{
int r=n;
int mid;
int ans=0;
while(l<=r)
{
mid=(l+r)/2;
if(k>-a[mid])
r=mid-1,ans=n-mid+1;
else
l=mid+1;
}
return ans;
}
int cmp(int a,int b)
{
return -a>-b;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
a[i]-=x;
}
sort(a+1,a+1+n,cmp);
/*for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;*/
ll ans=0;
for(int i=1;i<=n;i++)
{
ans+=judge(i+1,a[i]);
}
cout<<ans<<endl;
}
E.Sleeping Schedule
题目链接
题目大意:就是给你N个睡眠时间,一天有h个小时,然后每一次可以睡a[i]小时后起床,也可以在a[i]-1小时后起床,
他觉得在l~r范围内起床比较好,问你最多能有多少个好的起床
思路:就是记录一下,这个。。。
挺糟心的
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<map>
#include<vector>
#define ll long long
using namespace std;
const int maxn=2000+10;
const int inf=1e9+15;
ll dp[maxn][maxn];
int a[maxn];
int n;
int h,l,r;
int judge(int x)
{
x%=h;
if(x>=l&&x<=r)
return 1;
return 0;
}
int main()
{
cin>>n>>h>>l>>r;
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
memset(dp,-0x3f3f3f3f,sizeof(dp));
dp[0][0]=0;
for(int i=1; i<=n; i++)
{
for(int j=0; j<h; j++)
{
int k=(j+a[i])%h;
if(judge(k))
dp[i][k]=max(dp[i][k],dp[i-1][j]+1);
else
dp[i][k]=max(dp[i][k],dp[i-1][j]);
k=(j+a[i]+h-1)%h;
if(judge(k))
dp[i][k]=max(dp[i][k],dp[i-1][j]+1);
else
dp[i][k]=max(dp[i][k],dp[i-1][j]);
}
}
ll ans=0;
for(int i=0; i<h; i++)
{
ans=max(ans,dp[n][i]);
}
cout<<ans<<endl;
}
F.Maximum White Subtree
题目链接