A.Yet Another Tetris Problem 题意:看白了其实就是让你看看是否都为偶数,或者奇数,是的话输出YES,否则输出NO。
#include<bits/stdc++.h>
using namespace std;
int a[105];
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int flag = 0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i] % 2 == 0) flag++;
}
if(flag == n||flag ==0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
B.Yet Another Palindrome Problem 题意:就是判断是否有至少三个数以上的子数组满足回文串问题。
思路:只要找到两个相同的数,并且之间的距离是大于1,及还能放一个数以上的数,那么就可以找到至少为3的子数组满足题目要求。
#include<bits/stdc++.h>
#define maxn 6005
using namespace std;
int t;
int n;
int a[maxn];
bool flag;
int main(){
cin>>t;
while(t--){
flag =0;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(a[j]==a[i]&&j-i>=2){
flag=1;
break;
}
}
if(flag) break;
}
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
C.其实结合样例看比较好懂一些。就是求相邻R之间得最大距离,其中把开头跟n+1,也当作是R,那么小青蛙就是能一直跳。跳到最后。
#include<bits/stdc++.h>
using namespace std;
string s;
int main(){
int t;
cin>>t;
while(t--)
{
cin>>s;
int res=0,ans=0;
for(int i=0;i<s.size();i++)
if(s[i]=='R')
{
ans=max(i+1-res,ans);
res=i+1;
}
ans=max(ans,s.size()1-res);
cout<<ans<<endl;;
}
return 0;
}
D.Pair of Topics 题意:就是对公式进行变形,然后用二分减少复杂度就行了
一开始想了个O(n*n)复杂度得,明知道过不去,却还是试了试。然后就超时卡12了。
代码如下:
#include<bits/stdc++.h>
#define maxn 200005
using namespace std;
typedef long long ll;
ll a[maxn],b[maxn];
ll c[maxn];
ll d[maxn];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>b[i];
for(int i=1;i<=n;i++){
c[i] = a[i]-b[i];
d[i] = b[i]-a[i];
}
int ans = 0;
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
if(c[i] > d[j])
ans++;
}
}
cout<<ans<<endl;
return 0;
}
其实之前做过ICPC沈阳A题跟这个十分相似,但是这个是在那个签到提得基础上又稍微增加了点难度,算了,我不配说这话,还是太菜了。
AC代码 思路:就是我们如果变形一下得话就会变成ai-bi>bj-aj;那么首先我们先求得ai-bi得差给存起来,然后得话我们给其进行排序,然后一个for循环,找到第一个大于当前得bj-aj得位置,那么后面得肯定都大于,然后就这样就行了。
#include<bits/stdc++.h>
#define maxn 200005
using namespace std;
typedef long long ll;
ll a[maxn],b[maxn];
ll c[maxn];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>b[i];
for(int i=1;i<=n;i++)
c[i] = a[i] - b[i];
sort(c+1,c+n+1);
ll ans = 0;
for(int i=1;i<=n;i++){
ll res = b[i]-a[i];
ans += (c+n+1)-upper_bound(c+1,c+n+1,res);
if(res<0) ans--;
//cout<<ans<<endl;
}
cout<<ans/2<<endl;
}