地址:http://codeforces.com/contest/1324
题意:看着挺长的,实际上就这么些东西,俄罗斯方块。操作1:放2*1的块,随便无限放。操作2:非0集体减1。问最后是否能把方块全消除完。
解析:找一个最高的maxx,看其他能否全部变成maxx,由于放的方法是每次+2,那么看每个方块与maxx的差值,偶数即可。全为偶数就是YES,否则NO。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e2+10;
int a[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int maxx=-1;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]>maxx)
maxx=a[i];
}
int ok=0;
for(int i=0;i<n;i++)
{
if(a[i]<maxx)
{
int mid=maxx-a[i];
if(mid%2!=0)
{
ok=1;break;
}
}
}
if(ok)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
}
题意:能否从已给的数组中找到一个子串而且是回文。注意这个子串中间的元素是可以不连续的,但要保证顺序。
解析:题中说len>=3,那么就很简单了,我们只需要看Len==3的就可以了。因为对于len>3的任意回文串,里面一定存在一个len==3的回文子串(不一定连续)。len==3的回文串,a[1]一定==a[3],那么我们只需要两个for就可以了。对于当前的a[i],往后找到一个a[j]==a[i]而且,j!=i+1。即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=5e3+10;
int a[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int ok=0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[i]==a[j]&&j>i+1)
{
ok=1;break;
}
}
}
if(ok)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
题意:青蛙从0跳到n+1,到哪一格,就要执行当前格的方向跳,L就往左,R就往右。要求给出一个d,此为最长跳跃距离。找出最小的一个d来。而且保证一定能从0跳到n+1。
解析:其实这个题不用管L的,只需要看R就好了,因为只有R才能保证到达终点呀。样例1是有点误导的意思。记下所有R的出现位置,找到它们所有的间距,输出最大的就好了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=2e5+10;
int a[maxn];
char s[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>s;
int len=strlen(s);
int l,r;
int ok=0,ok2=0;
int tot=0;
for(int i=0;i<len;i++)
{
if(s[i]=='R')
{
ok=1;
a[tot++]=i;
}
else
{
ok2=1;
}
}
if(!ok)
{
cout<<len+1<<endl;continue;
}
int maxx=-1;
for(int i=0;i<tot-1;i++)
{
int mid=a[i+1]-a[i];
if(mid>maxx)
maxx=mid;
}
int kk=max(a[0]+1,len-a[tot-1]);
cout<<max(kk,maxx)<<endl;
}
}
题意:要求对于i<j,ai+aj>bi+bj,找出有几对。
解析: 看这数据,暴力行不通的。我刚开始纠结于顺序i<j的问题,所以没有A出来。我们可以把这个式子变一下,ai-bi+aj-bj>0。即ci+cj>0。这不就和顺序没有关系了嘛。直接把每个a[i]-b[i]存一下,再二分查找就可以了。记得开LL。。O(n*logn)的复杂度
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
ll a[maxn];
ll b[maxn];
ll vis[maxn];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
scanf("%lld",&b[i]);
for(int i=1;i<=n;i++)
{
vis[i]=a[i]-b[i];
}
sort(vis+1,vis+n+1);
ll l=1,r=n;
ll sum=0;
while(l<r)
{
if(vis[l]+vis[r]>0)
{
sum+=r-l;
r--;
}
else
l++;
}
cout<<sum<<endl;
}