news 2026/4/23 11:19:28

打卡信奥刷题(2685)用C++实现信奥题 P2998 [USACO10NOV] Candy S

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
打卡信奥刷题(2685)用C++实现信奥题 P2998 [USACO10NOV] Candy S

P2998 [USACO10NOV] Candy S

题目描述

FJ 知道贝茜喜欢吃糖果。FJ 有N(1≤N≤40000)N (1 \le N \le 40000)N(1N40000)颗糖果,他想在若干天内将这些糖果送给贝茜。每一天,FJ 会让贝茜从他提供的一个列表中选择她当天想吃多少糖果,该列表有Nopt(1≤Nopt≤50)Nopt(1 \le Nopt \le 50)Nopt(1Nopt50)种不同的选项Ci(1≤Ci≤N)C_i (1 \le C_i \le N)Ci(1CiN)。她必须恰好拿走CiC_iCi颗糖果。

农夫约翰给出了F(1≤F≤50)F(1 \le F \le 50)F(1F50)个他喜欢的数字FNi(1≤FNi≤N)FN_i (1 \le FN_i \le N)FNi(1FNiN)。每当一天结束时,如果剩余的糖果数量恰好等于这些数字之一,贝茜可以选择添加M(1≤M≤100)M(1 \le M \le 100)M1M100)颗糖果。如果添加糖果后又出现了另一个 FJ 喜欢的数字,贝茜可能会再次获得添加MMM颗糖果的机会。在最好的情况下,贝茜可以获得无限多的糖果!

当贝茜无法在列表中选择糖果数量(因为糖果不够)时,她就无法再获得更多糖果。

不幸的是,贝茜不知道该如何规划才能吃掉尽可能多的糖果,所以她需要你的帮助。

举例来说,考虑以下场景:

  • FJ 最初有101010颗糖果
  • 贝茜每天可以选择吃掉333555颗糖果
  • 当剩余的糖果数量是222444时,FJ 会添加111颗糖果

贝茜可以使用以下选择来最大化她能吃掉的糖果数量:

初始糖果数 吃掉糖果数 剩余糖果数 奖励糖果数 最终糖果数 第1103707273415353213433000

输入格式

  • 111行:四个由空格分隔的整数:N,Nopt,F,MN,Nopt,F,MN,Nopt,F,M
  • 222行到第Nopt+1Nopt+1Nopt+1行:第i+1i+1i+1行包含一个整数:CiC_iCi
  • Nopt+2Nopt+2Nopt+2行到第Nopt+F+1Nopt+F+1Nopt+F+1行:第i+Nopt+1i+Nopt+1i+Nopt+1行包含一个整数:FNiFN_iFNi

输出格式

  • 111行:一个整数,表示贝茜能吃掉的最大糖果数量,如果贝茜能吃掉无限多的糖果,则输出-1

输入输出样例 #1

输入 #1

10 2 2 1 3 5 4 2

输出 #1

12

C++实现

#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#definelllonglong#defineinf0x7f7f7f7f#defineN60usingnamespacestd;inlinellread(){ll x=0,f=1;charch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}returnx*f;}intn,nopt,F,m,c[N],f[N],book[40110],dp[40110],cnt[40110],ans;intmain(){n=read(),nopt=read(),F=read(),m=read();for(inti=1;i<=nopt;i++)c[i]=read();for(inti=1;i<=F;i++)book[read()]=1;memset(dp,-1,sizeof(dp));dp[n]=0;book[n]=false;for(inti=n;i;i--){if(dp[i]==-1)continue;if(cnt[i]>F+1)returnprintf("-1\n"),0;if(book[i]){cnt[i]++;if(dp[i]>dp[i+m]){dp[i+m]=dp[i];i+=m+1;}continue;}for(intj=1;j<=nopt;j++){if(i-c[j]<0)continue;dp[i-c[j]]=max(dp[i-c[j]],dp[i]+c[j]);}}for(inti=n;i>=0;i--)ans=max(ans,dp[i]);printf("%d\n",ans);return0;}

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 10:02:46

Linux OCR工具效率革命:3分钟打造极速启动方案

Linux OCR工具效率革命&#xff1a;3分钟打造极速启动方案 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件&#xff0c;适用于Windows系统&#xff0c;支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode.com/GitHub_Tren…

作者头像 李华
网站建设 2026/4/10 13:08:58

Raylib游戏开发实战指南:零基础到项目部署完整教程

Raylib游戏开发实战指南&#xff1a;零基础到项目部署完整教程 【免费下载链接】raylib raysan5/raylib 是一个用于跨平台 C 语言游戏开发库。适合在进行 C 语言游戏开发时使用&#xff0c;创建 2D 和 3D 图形应用程序。特点是提供了丰富的图形和音频处理功能、易于使用的 API …

作者头像 李华
网站建设 2026/4/19 14:05:23

彩虹骨骼可视化技术详解:AI手势追踪实战案例

彩虹骨骼可视化技术详解&#xff1a;AI手势追踪实战案例 1. 引言&#xff1a;人机交互的新范式——从触控到手势感知 随着人工智能与计算机视觉的深度融合&#xff0c;传统的人机交互方式正在被重新定义。触摸屏、语音指令已不再是唯一选择&#xff0c;基于视觉的手势识别技术…

作者头像 李华
网站建设 2026/3/31 1:09:40

Scrapy爬取Ajax动态加载页面三种实用方法

Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;动态加载技术广泛应用于现代网站开发中&#xff0c;它能实现页面局部刷新、提升用户体验&#xff0c;但也给网络爬虫带来了挑战 —— 传统 Scrapy 爬虫只能抓取页面初始加载的 HTML 内容&#xff0c;无法直接获取通…

作者头像 李华
网站建设 2026/4/22 14:22:37

【.NET高性能编程必修课】:Span在大规模文件处理中的6大应用场景

第一章&#xff1a;Span高性能文件处理的核心价值在现代高并发系统中&#xff0c;文件处理的性能直接影响整体服务响应能力。Span 作为一种轻量级、高效的数据结构&#xff0c;为大文件读取与切片操作提供了底层优化支持。其核心优势在于避免内存拷贝&#xff0c;直接引用原始数…

作者头像 李华
网站建设 2026/4/16 16:06:43

MediaPipe Hands极速推理机制:CPU优化底层原理解析

MediaPipe Hands极速推理机制&#xff1a;CPU优化底层原理解析 1. 技术背景与问题提出 随着人机交互技术的快速发展&#xff0c;手势识别正逐步成为智能设备、虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和智能家居等场景中的核心感知能力。传统…

作者头像 李华