题解:模拟
一旦不匹配就要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 ",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 ",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; }
后面的题国庆或许会补....