中二羊专题:栋栋吃糖果

这篇具有很好参考价值的文章主要介绍了中二羊专题:栋栋吃糖果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

U163898

题目

题目背景

栋栋参加比赛拿下了一等奖,老师奖励了很多糖果。

题目描述

一共有 \(m\) 种糖果,其中第i种糖果的数量为 \(m_i\) 。栋栋吃糖时会获得快乐值,并且他喜欢换着口味吃糖。当栋栋吃下第一个糖果时快乐值为 \(0\) ,接下来,每吃一个不同口味的糖果(与上一个糖不同),快乐值就会增加 \(5\) 点,而连续吃下 \(k\) 个相同口味的糖果,快乐值就会减少 \(3*(k-1)\) 点。栋栋已经下定决心要吃完所有的糖果。现在他想知道如何安排吃糖的顺序才能使快乐值最大。请你求出最大快乐值。

输入格式

输入分两行
第一行输入整数 \(m\)
第二行输入 \(m\) 个整数,分别表示每种糖果的数量 \(m_i\)

输出格式

输出栋栋能获得的最大快乐值

输入输出样例

样例1
输入1
3
3 1 1
输出1
20
样例2
输入2
3
4 1 1
输出2
17

说明/提示

对于\(100\%\)的数据,有\(1<m\le1000\)\(1\le m_i≤10000\)\(1<m\le1000\)\(1≤m_i≤10000\)。保证结果在int范围内。

题解

定义

此题是广义鸽巢原理的一道例题
先说一下什么是鸽巢原理:
定义:如果 \(k+1\) 个或更多个物体放入 \(k\) 个盒子,那么至少有一个盒子包含了 \(2\) 个或更多的物体。此定理也被称为狄利克雷抽屉原理。
但是此题用到的是广义鸽巢原理。
定义:如果 \(N\) 个物体放入 \(k\) 个盒子,那么至少有一个盒子包含了至少 \(\left\lceil\dfrac{N}{k}\right\rceil\) 个物体。
举个例子,在100人中,至少有 \(\left\lceil\dfrac{100}{12}\right\rceil=9\) 个人的生日在同一个月。


看完题后,我们会发现,有许多东西我们都不需要。我们现在需要的是 \(N\)\(k\)
用总糖果数量减去最大数量糖果类型可以得出其它糖果数量综合。
所以处理情况是这样的:

...
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;
	}
...

当我们发现必须减少快乐值时:
如果不计损失的快乐值,那么就只有 \(ans*10\) 的快乐值了。
我们可以这么理解:
我们已经知道了其它类糖果总数量为 \(ans\) ,最大数量糖果类总数量为\(md\) ,所以我们把可以看作有 \(md-1\) 个盒子要放下 \(ans\) 个糖果。(关键思路)
所以代码就出来了,如果求总和会要用到等差数列公式: \(\frac{n(a+n)}{2}\) 。(注意此处等差数列公式是 \(1+2+...+n-1+n\)

...
	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;
}

后记:几年前的东西,看个乐子。文章来源地址https://www.toymoban.com/news/detail-443643.html

到了这里,关于中二羊专题:栋栋吃糖果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • class092 贪心经典题目专题4【左程云算法】

    2024-4-23 14:00:04 以下内容源自《【左程云算法】》 仅供学习交流使用 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN@日星月云 博客主页是https://jsss-1.blog.csdn.net 禁止其他平台发布时删除以上此话 算法讲解092【必备】贪心经典题目专题4 先占个位 迎着日光

    2024年04月26日
    浏览(28)
  • 题目3180:蓝桥杯2023年第十四届省赛真题-互质数的个数======及探讨互质专题

    https://www.dotcpp.com/oj/problem3162.html 已AC。 (1)首先大家要知道什么叫互质: 以及它们的性质: 在数论中,对正整数n,欧拉函数φ(n)是小于或等于n的正整数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为φ函数(由高斯所命名)或是欧拉总计函数(totient fu

    2023年04月24日
    浏览(32)
  • 分享几个Ecshop中二次开发的常见方法

    收货人信息的省市区设成非必选项 一般面向国外用户的ECSHOP商城,可能会有这方面的需求:【将Ecshop中收货人信息的省市区设成非必选项】,其实也就是只留一个“请选择国家”的下拉选择框。 修改相关JS文件 打开 /js/shopping_flow.js 文件,将下面JS代码删除掉 JavaScript Code 复制

    2023年04月16日
    浏览(25)
  • 概率论中二项分布期望与方差的详细推导

    二项分布的期望和方差表达式非常简洁,但推导过程却很灵活,我们做如下推导: 概率论中,离散型随机变量期望的定义为 二项分布概率公式为 : 则其期望为 : 我们记   则 因为 所以 根据二项式展开定理,有 所以原式 概率论中,方差的定义为 因为上文已经得到E(X),所以

    2024年02月21日
    浏览(33)
  • 在Go项目中二次封装Kafka客户端功能

    在上一章节中,我利用Docker快速搭建了一个Kafka服务,并测试成功Kafka生产者和消费者功能,本章内容尝试在Go项目中对Kafka服务进行封装调用, 实现从Kafka自动接收消息并消费。 在本文中使用了Kafka的一个高性能开源库Sarama, Sarama是一个遵循MIT许可协议的Apache Kafka Go客户端库, 该开源

    2024年02月07日
    浏览(46)
  • 蓝桥杯(C++ 矩形总面积 错误票据 分糖果1 三国游戏 分糖果2)

    目录 一、矩形总面积  思路: 代码:   二、错误票据 思路: 代码:   三、分糖果1 思路: 代码: 四、三国游戏 思路: 代码:  五、分糖果2 思路: 代码: 1、分四种情况为没有重叠 (x[2] x[3] || y[2] y[3] || x[4] x[1] || y[4] y[1]),这种情况下输出为两矩形面积之和。 2、重叠的

    2024年01月20日
    浏览(27)
  • 编程题分享:有⼀堆糖果,其数量为n,现将糖果分成不同数量的堆数

    背景 近期面试遇到一家公司的编程题,觉得挺有参考价值 此处使用 PHP 语言,进行编码测试, 编码之前要进行思路分析,避免无头苍蝇,走一步看一步 最后,希望后期面试顺利!欢迎指摘 . 题目: 思路分析: 初始测试数据比较小,可以在草稿纸上穷举分配方案,寻找规律

    2024年02月11日
    浏览(30)
  • 【LeetCode-135】分发糖果(贪心)

    LeetCode135.分发糖果 题目描述 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。 相邻的孩子中,评分高的孩子必须获得更多的糖果。

    2024年01月24日
    浏览(27)
  • 贪心算法|135.分发糖果

    力扣题目链接 看着是困难题,其实仔细理解并不是很吓人。 这题的重点在如何遍历。  vectorint candyVec(ratings.size(), 1); 还有它是个啥? vector int myVector(num); 或者 vector int myVector(n,num); 类似于resize的用法  函数原型: void resize (size_type n); void resize (size_type n, const value_type val);  作

    2024年04月10日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包