蒟蒻养成记——幼儿园数论(1)

探讨了通过特定操作调整序列中数值,以实现最大数量相同元素的方法。解析了算法思路,给出了解决方案,并提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Change

1s,256M

【题目描述】

给你一个含n个整数的序列A,每次你可以对这个序列做如下操作:

1)选择2个元素ai,aj(i!=j)

2)改变这2个元素的值,也就是ai=ai+1aj=aj-1

你可以对这个序列进行任意次操作,问你最多能得到多少个相同的数?

【输入格式】

第一行n

第二行n个数,为序列A

【输出格式】

一个数为最多能得到相同数的个数

【输入输出样例】

Input1

2
2 1

Output1

1

Input2

3
1 4 1

Output2

3

【数据约定】

100%数据:n<=10^5, |ai|<=10^4


【解法】

第一眼看到题,什么来的,线段数维护区间?后面想想无论怎么操作所有数字的和不变;

所以所有的和是n的倍数答案就是n(刚好平均分配)

如果不是n的倍数答案就是n-1(牺牲一个数,把其他数都变得一样大)


【代码】

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
using namespace std;
int i,j,k,m,n,o,p,js,jl,mm;
int main()
{
FILE *fin,*fout;
fin=fopen("change.in","rb");
fout=fopen("change.out","wb");
fscanf(fin,"%d",&n);
js=0;
for(i=1;i<=n;i++)
{
   fscanf(fin,"%d",&jl);
   if(js>0)js=js+jl;
   else js=js+n-(0-jl)%n;
    }
    m=js%n;
    if(m==0)fprintf(fout,"%d",n);
    else fprintf(fout,"%d",n-1);
    fclose(fin);
    fclose(fout);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值