洛谷九月月赛II

题解:模拟

一旦不匹配就要break

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int l,q;

int ans[2002],xi[2002],yi[2002];

string s[2002];

int main()
{
    scanf("%d%d",&l,&q);
    for(int i=1;i<=l;i++) cin>>s[i];
    for(int i=1;i<=q;i++) cin>>xi[i]>>yi[i];
    for(int i=1;i<=q;i++)
    {
        int s1=0,s2=0,x=xi[i],y=yi[i]-1;
        for(int j=1;j<=(l/2)+1;j++)
        {
            if(y-j>=0&&y+j<l&&s[x][y-j]==s[x][y+j]) s1+=2;
            else break;
        }
        for(int j=1;j<=(l/2)+1;j++)
        {
            if(x-j>=1&&x+j<=l&&s[x-j][y]==s[x+j][y]) s2+=2;
            else break;
        }        
        ans[i]=max(s1,s2);
    }
    for(int i=1;i<=q;i++) printf("%d\n",ans[i]+1);
    return 0;
}

 

题解:

30分:O(n^2)判断两根杆子端点是否重合

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 200005
using namespace std;

int n,m,ans;

int h[N];

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&h[i]);
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            int d=j-i;
            if((h[i]+d==h[j])||(h[j]+d==h[i])||(h[i]+h[j]==d))
            ans++;
        }
    }
    printf("%d\n",ans);
    return 0;
} 

100分:记录每根杆子向左或向右倒下去的点

sort一下看有几根杆子倒在同一个点。

#include<iostream>
#include<cstdio>
#include<cstring> 
#include<algorithm>
#define N 200005
#define LL long long
using namespace std;

int n,m,t;

LL g,ans,p[N],h[N];

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&h[i]);
        p[++t]=i-h[i];
        p[++t]=i+h[i];
    } 
    sort(p+1,p+t+1);p[0]=-1000000002;
    for(int i=1;i<=t+1;i++)
    {
        
        if(p[i]!=p[i-1]) ans=ans+g*(g-1)/2,g=1;
        else g++;
    }
    cout<<ans<<endl;
    return 0;
}

 后面的题国庆或许会补....

猜你喜欢

转载自www.cnblogs.com/zzyh/p/9697047.html
今日推荐