20241006每日一题洛谷P1031
对题目第一印象:贪心吧,或者纯模拟
第一次贪心,由于左右端堆只能想内一堆移动,遂放弃
第一次模拟,开多个数组,(可能还要用递归?),遂放弃
于是求助如来佛祖:
从逻辑上可以看出,第一堆缺或者多的牌只能移动到第二堆上
当第一堆达到期望值时,第一堆便不能再做操作,于是,可以将第二堆作为第一堆来处理
(有点像递归?)
举一个简单的例子:
4 9 8 17 6
期望值为:reduce()/4=10;
第一堆:需要1,则第二堆给第一堆1
第二堆:需要2+1,则第三堆给第二堆3
第三堆:需要-7+3,则第四堆给第三堆-4
第四堆:需要4,上一步给出的-4相当于给入的4,则第四堆也达到期望值
实现代码如下
/////
int main() { int n,sum=0,cnt=0; int a[110]; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); sum += a[i]; } sum /= n;//计算期望值 for (int i = 0; i < n; i++) { if ((a[i] - sum) != 0) { a[i + 1] += a[i] - sum;//计算期望值差 cnt++;//操作数 } } printf("%d", cnt); return 0; }
/////
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效