中二羊专题:栋栋吃糖果
U163898
题目
题目背景
栋栋参加比赛拿下了一等奖,老师奖励了很多糖果。
题目描述
一共有
输入格式
输入分两行
第一行输入整数
第二行输入
输出格式
输出栋栋能获得的最大快乐值
输入输出样例
样例1
输入1
3
3 1 1
输出1
20
样例2
输入2
3
4 1 1
输出2
17
说明/提示
对于
题解
定义
此题是广义鸽巢原理的一道例题。
先说一下什么是鸽巢原理:
定义:如果
但是此题用到的是广义鸽巢原理。
定义:如果
举个例子,在100人中,至少有
看完题后,我们会发现,有许多东西我们都不需要。我们现在需要的是
用总糖果数量减去最大数量糖果类型可以得出其它糖果数量综合。
所以处理情况是这样的:
...
signed main(){
int m,md=0,ans=0,sum,a;
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d",&a);
ans+=a;
md=max(md,a);
}
ans-=md;
...
return 0;
}
当我们发现吃糖时不用减少快乐值时,即吃重复糖最多只吃一次时:
...
if(ans-md>=-1){
printf("%d",(ans+md-1)*5);
return 0;
}
...
当我们发现必须减少快乐值时:
如果不计损失的快乐值,那么就只有
我们可以这么理解:
我们已经知道了其它类糖果总数量为
所以代码就出来了,如果求总和会要用到等差数列公式:
...
const int P1=ceil(md/(double)(ans+1));
const int P2=md/(ans+1);
const int P3=md%(ans+1);
sum-=3*((ans+1-P3)*(P2-1)*P2/2+P3*P1*(P1-1)/2);
printf("%d",sum);
...
代码(不建议看)
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<cstdio>
using std::max;
signed main(){
int m,md(0),ans(0),sum,a;
scanf("%d",&m);
for(register int i(1);i<=m;i=-~i){scanf("%d",&a);md=max(md,a),ans+=a;}
ans-=md;
if(ans-md>=-1){
printf("%d",(ans+md-1)*5);
exit(0);
}
sum=ans*10;
const int P1=ceil(md/(double)(ans+1));
const int P2=md/(ans+1);
const int P3=md%(ans+1);
sum-=3*((ans+1-P3)*(P2-1)*P2/2+P3*P1*(P1-1)/2);
printf("%d",sum);
exit(0);
return 0;
}
后记:几年前的东西,看个乐子。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗