HUST 1353 Dartboard
构造。应该有多种构造方法。做的时候WA了好几发,怀疑做法是错的,事实上是代码写搓了。。
我是这样构造的:先从上往下左右放奇数,再从下往上左右填偶数
(一)如果n/2是偶数(以12为例) 左边列是内环,右边列是外环
(二)如果n/2是奇数(以10为例) 左边列是内环,右边列是外环
#include <stdio.h> #include <algorithm> #include <string.h> #include <queue> #include <stack> #include <map> #include<cmath> #include <vector> using namespace std; int a[500],b[500]; int n; int ans[500]; int tot; int main() { int T; scanf("%d",&T); while(T--) { scanf("%d",&n); int num=n/2; memset(a,0,sizeof a); memset(b,0,sizeof b); int small=1; int large=n-1; for(int i=1;i<=(num+1)/2;i++) { if(i%2==1) { b[i]=small; b[num-i+1]=large; } else { a[i]=small; a[num-i+1]=large; } small=small+2; large=large-2; } int x=2; for(int i=num;i>=1;i--) { if(a[i]==0) a[i]=x; else b[i]=x; x=x+2; } // for(int i=1;i<=n/2;i++) printf("%d ",a[i]); printf("\n"); // for(int i=1;i<=n/2;i++) printf("%d ",b[i]); printf("\n"); tot=1; for(int i=n/2;i>=1;i--) { ans[tot]=a[i]; tot++; ans[tot]=b[i]; tot++; } ans[n+1]=ans[1]; ans[n+2]=ans[2]; int sum=0; for(int i=1;i<=n;i++) sum=sum+(ans[i]-ans[i+2])*(ans[i]-ans[i+2]); for(int i=1;i<=n/2;i++) sum=sum+(ans[2*i-1]-ans[2*i])*(ans[2*i-1]-ans[2*i]); printf("%d\n",sum); } return 0; }