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("
");
      //  for(int i=1;i<=n/2;i++) printf("%d ",b[i]); printf("
");

        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
",sum);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5195033.html