Boxes-(思维)

问题 K: Boxes

时间限制: 2 Sec   内存限制: 256 MB
提交: 345   解决: 82
[ 提交][ 状态][ 讨论版][命题人: admin]

题目描述

There are N boxes arranged in a circle. The i-th box contains Ai stones.

Determine whether it is possible to remove all the stones from the boxes by repeatedly performing the following operation:

Select one box. Let the box be the i-th box. Then, for each j from 1 through N, remove exactly j stones from the (i+j)-th box. Here, the (N+k)-th box is identified with the k-th box.
Note that the operation cannot be performed if there is a box that does not contain enough number of stones to be removed.

Constraints
1≤N≤105
1≤Ai≤109

输入

The input is given from Standard Input in the following format:

N
A1 A2 … AN

输出

If it is possible to remove all the stones from the boxes, print YES. Otherwise, print NO.

样例输入

5
4 5 1 2 3

样例输出

YES

提示

All the stones can be removed in one operation by selecting the second box.


这题的确很有趣:

问题很简单就是有   1~n的位置 围着一个圈顺时针  就把它当作盒子吧

(英语不好)。。。盒子里装着a[1~n]个石头。

(以某一处为起点从盒子里拿东西以起点距离)那拿  (距离+1)个石头。

就是  6    3    5    7    9

 1、-  1    2    3    4    5

 2、-  5    1    2    3    4

结果   0    0    0    0    0

所以是YES

这题我当时也没做出来,然后回来时队友就做出来了。

后来问了扬哥哥才知道怎么一回事。

其实石子里的大小是不确定的,因为每一个位置放的石头个数不同。

这道题首先是逆向来想,题目要你一圈一圈地解开,你可以变成一圈一圈加上去。

后来你就会发现石头个数变化你是无法捉摸,而石头前后的差值你却可以确定。

因为题目固定了方向,石头的差值:D[ i ]=a[ i ]-a[ i-1 ]        ,(i!=1);

                                                          D[1]=a[ 1 ]-a[ n ];

加一圈其实差值只有两个可能:            A、1                     B、1-n

其实你可以通过                        sum=    {    [    (1+n)×n    ]    /  2 }    ×    T;

算出来            次数T            对于这些差值减去T。

例如                    1    2    3    4    5

                           2    3    4    5    1

                           3    4    5    1    2

                得到    6    9    12   10  8

           D[1~5]:    -2   3    3    -2    -2

           减去T:   -5   0    0    -5    -5

得到的只可能是非正数且能%n==0.

具体可以看代码:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{
       ll n,a[100050],d[100050],sum=0;
       scanf("%lld",&n);
       for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            if(i!=1){
                d[i]=a[i]-a[i-1];
            }
            sum+=a[i];
       }
       d[1]=a[1]-a[n];
       if(sum%(n*(n+1)/2)==0){
            ll t=sum/(n*(n+1)/2);
            for(int i=1;i<=n;i++){
                d[i]-=t;
            }
            int flag=1;
            for(int i=1;i<=n;i++){
                if( d[i]<=0 && (d[i])%n==0){
                    continue;
                }else{
                    flag=0;break;
                }
            }
            if(flag)
                printf("YES\n");
            else{
                printf("NO\n");
            }
       }else{
            printf("NO\n");
       }
       return 0;
}



猜你喜欢

转载自blog.csdn.net/Z_sea/article/details/80067341