[蓝桥杯][2014年第五届真题]分糖果

    科技2022-07-13  121

    题目链接:分糖果

    解题思路:模拟解题,先遍历所有的孩子,看看是否已经相同,如果是就退出,否则继续分。每一个孩子先减去自己的一半,然后从左往右开始添加自己被右边分到的糖果,最后再看哪个孩子是奇数,就添加。

    #include<bits/stdc++.h> #define x first #define y second #define mem(h) memset(h,-1,sizeof h) #define mcp(a,b) memcpy(a,b,sizeof b) using namespace std; typedef long long LL; typedef unsigned long long ull; typedef pair<int,int>PII; typedef pair<double,double>PDD; namespace IO{ inline LL read(){ LL o=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){o=o*10+c-'0';c=getchar();} return o*f; } }using namespace IO; //#############以上是自定义技巧(可忽略)########## const int N=1e5+7,M=2e5+7,INF=0x3f3f3f3f,mod=1e9+7,P=131; int n; int a[N]; int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; int ans=0; while(1){ int flag=1; for(int i=2;i<=n;i++){ if(a[1]!=a[i])flag=0;//判断是否是一样的,如果有一个不一样就不合法 } if(flag)break; for(int i=1;i<=n;i++)a[i]/=2;//每个孩子减去一半 int temp=a[1];//a[1]这个要先拿出来,不然后面加的值的错误的 for(int i=1;i<n;i++){ a[i]+=a[i+1];//每个孩子加上右边给的一半 } a[n]+=temp;//最后一个孩子的右边是a[1] for(int i=1;i<=n;i++){ if(a[i]&1){//如果是奇数 ans++; a[i]++; } } } cout<<ans<<endl; return 0; }
    Processed: 0.018, SQL: 8