题解 B2020 【分糖果】

囧仙

2021-07-03 18:27:01

题解

题解

根据题意模拟。在读入 5 堆糖后,依次枚举每个小朋友,先计算出 \dfrac{1}{3} 堆的大小 t ,然后加给左右两边的小朋友拥有的糖果数,自己保留一份。同时,我们记 s 表示一共被吃掉的糖果的数目,那就加上,分糖前,当前小朋友手上的糖的数目,减去 3\times t

这题的主要注意点就是“分给周围小朋友”这一块。由于第 5 个小朋友下面是第 1 个小朋友,而第 1 个小朋友左边是第 5 个小朋友,所以你可能需要特判。比较简单的做法是,给小朋友分别编号为 0,1,2,3,4 ,那么对于第 i 个小朋友,他右侧的小朋友编号为 (i+1)\bmod 5 ,左侧为 (i-1)\bmod 5

又因为, -1\equiv 4 \pmod 5 ,因此为了防止对负数取模带来的麻烦,左侧的小朋友的编号可以表示为 (i+4)\bmod 5

参考代码

#include<bits/stdc++.h>
#define up(l,r,i) for(int i=l,END##i=r;i<=END##i;++i)
#define dn(r,l,i) for(int i=r,END##i=l;i>=END##i;--i)
using namespace std;
typedef long long i64;
const int INF =2147483647;
int A[5],s,t;
int qread(){
    int w=1,c,ret;
    while((c=getchar())> '9'||c< '0') w=(c=='-'?-1:1); ret=c-'0';
    while((c=getchar())>='0'&&c<='9') ret=ret*10+c-'0';
    return ret*w;
}
int main(){
    up(0,4,i) A[i]=qread();
    up(0,4,i){
        t=A[i]/3,s+=A[i]-3*t; A[(i+1)%5]+=t,A[(i+4)%5]+=t,A[i]=t;
    }
    up(0,4,i) printf("%d%c",A[i],i==4?'\n':' ');
    printf("%d\n",s);
    return 0;
}