Boxes

探讨了在一个圆形排列的盒子中移除所有石头的问题,通过选择特定的盒子并按规则移除石头,判断是否能完全清空所有盒子。

题目描述

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.

题意:给出N个盒子,每个盒子装有Ai个石头。
每次操作可以选择一个盒子i,对于每个j(1 <= j <= N),从第(i+j)个盒子移走j个石头(第N+k个盒子即为第k个盒子)

如果存在一个盒子的石头数目不够操作将不能进行。求能否将所有的石头移走。如果可以全部移走输出yes否则输出no。

思路:如果可以将全部石头移走的话那么将是全部的石头加起来满足前n项和或者满足前n项和的倍数,  其次如果这些是头可以全部移走的两者之间的差值将会是1或者1-n根据这个用一个数组vis将两个之间的差值保存一下,之后再用for判断就可以了,这里需要注意的一点是我提交了好几代码都不对,后来发现是求前n项和的时候没有用longlong 。




#include<cstdio>
#include<cstring>
#include<math.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<iostream>
#include<map>
#define mes(a,b) memset(a,b,sizeof(a))
#define rep(i,m,n) for(i=m;i<=n;i++)
typedef long long ll;
using namespace std;
int max3(int a,int b,int c){return max(max(a,b),c);}
ll min3(ll a,ll b,ll c){return min(min(a,b),c);}
const double PI=acos(-1);
const int inf=0x3f3f3f3f;
const double esp=1e-6;
const int maxn=1e6+5;
const int mod=1e9+7;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll inv(ll b){if(b==1)return 1; return (mod-mod/b)*inv(mod%b)%mod;}
ll fpow(ll n,ll k){ll r=1;for(;k;k>>=1){if(k&1)r=r*n%mod;n=n*n%mod;}return r;}
ll Fpow(ll n,ll k){ll r=1;for(;k;k>>=1){if(k&1)r=r*n;n=n*n;}return r;}
ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}

int n;
int a[100005],vis[100005];


int main(){
    while(cin>>n)
    {
        ll sum=0,sum2,t;
        bool flag=1;
        memset(vis,0,sizeof(vis));
        for(int i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];

        }
         sum2=(ll)((1+n))*n/2;
        if(sum%sum2!=0)
        {
            printf("NO\n");
            continue;
        }


        t=sum/sum2;//printf("%d\n",t);
        a[n]=a[0];
        for(int i=0; i<n; i++)
            vis[i]=a[i+1]-a[i];
        for(int i=0; i<n; i++)
        {
            if((vis[i]-t)%n!=0 || vis[i]-t>0)
            {
                flag=0;
                break;
            }


        }
        if(flag==0)
            printf("NO\n");
        else
            printf("YES\n");
    }

    return 0;
}

### Anchor Boxes的概念 在目标检测中,Anchor Boxes(锚框)是一种预定义的边界框,用于帮助模型更有效地预测图像中物体的位置和类别。Anchor Boxes的核心思想是通过引入多个具有不同比例和长宽比的参考框,来适应不同形状和大小的物体。这些预定义的框在每个网格单元中生成,从而使得模型能够在同一个网格单元中检测多个物体。 在传统的YOLO算法中,每个网格单元只能预测一个边界框和一个类别。然而,当多个物体的中心点落在同一个网格单元中时,这种方法无法有效处理这种情况。为了解决这个问题,Anchor Boxes被引入,使得每个网格单元可以预测多个边界框,并且每个边界框对应一个特定的Anchor Box。这样,模型就能够在一个网格单元中检测到多个物体,从而提高了检测的准确性和鲁棒性 [^1]。 ### Anchor Boxes的应用 在实际应用中,Anchor Boxes的设计通常基于训练数据集中物体的尺寸和形状分布。通过聚类分析(如K-means算法),可以从训练集的边界框中提取出一组具有代表性的Anchor Boxes。这些Anchor Boxes的尺寸和长宽比能够很好地匹配数据集中的物体特征,从而提高模型的预测性能。 在目标检测模型中,Anchor Boxes的应用主要体现在以下几个方面: 1. **多物体检测**:通过在每个网格单元中生成多个Anchor Boxes,模型可以在同一位置检测到多个物体。这对于处理物体中心点重叠的情况非常有效,例如行人和车辆的中心点落在同一个网格单元中的场景 [^2]。 2. **边界框预测**:模型在训练过程中会学习如何调整每个Anchor Box的位置和大小,以更好地匹配真实边界框。这种调整通常是通过预测Anchor Box与真实边界框之间的偏移量来实现的。 3. **类别预测**:除了调整边界框的位置和大小外,模型还会为每个Anchor Box预测一个类别概率分布,从而确定该边界框中包含的物体类别。 4. **损失函数设计**:在训练过程中,损失函数通常包括边界框位置损失、边界框大小损失和类别损失。这些损失项分别用于优化Anchor Box的位置、大小和类别预测。 ### Anchor Boxes的实现示例 以下是一个简单的Python代码示例,展示了如何在目标检测模型中使用Anchor Boxes: ```python import numpy as np # 定义Anchor Boxes的尺寸和长宽比 anchor_boxes = np.array([ [120, 120], # 尺寸为120x120 [200, 80], # 尺寸为200x80 [80, 200] # 尺寸为80x200 ]) # 假设每个网格单元生成3个Anchor Boxes num_anchors = len(anchor_boxes) # 定义网格单元的数量 grid_height, grid_width = 3, 3 # 初始化输出张量 output_tensor = np.zeros((grid_height, grid_width, num_anchors, 8)) # 8表示[pc, bx, by, bh, bw, c1, c2, c3] # 假设某个网格单元中有两个物体,分别对应两个Anchor Boxes output_tensor[1, 1, 0, :] = [1, 0.5, 0.5, 1.2, 0.8, 1, 0, 0] # 第一个Anchor Box,类别为行人 output_tensor[1, 1, 1, :] = [1, 0.5, 0.5, 0.8, 1.2, 0, 1, 0] # 第二个Anchor Box,类别为车辆 # 输出张量的形状为(3, 3, 3, 8),其中3表示网格单元的数量,3表示Anchor Boxes的数量,8表示每个Anchor Box的输出维度 print(output_tensor.shape) ``` 在这个示例中,每个网格单元生成了3个Anchor Boxes,并且每个Anchor Box的输出维度为8。通过这种方式,模型能够在同一个网格单元中检测到多个物体,并且每个物体对应一个特定的Anchor Box [^3]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值