热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浙江大学软件学院2020年保研上机模拟练习74ShoppingWithCoupons

目录解题思路演进过程第一次程序第二次程序第三次程序解题思路演进过程首先是题目的理解上:有n个商品,n张优惠券,实际上能买的商品个

目录

解题思路演进过程

第一次程序

 第二次程序

第三次程序


解题思路演进过程

首先是题目的理解上:有n个商品,n张优惠券,实际上能买的商品个数最多就是n*n,为啥呢,这题默认是买一个商品必须用一张券,而且一个商品每张面值的券只能用一次。也就是,即使有1个6元的商品,当券对这个商品全部用过一次,即使有10元商品和最大面值3的券,也只能够选后者。

第一次我套用了0-1背包的动态规划,但是遗憾的是,由于背包容量(在本题是钱的数量大于10的6次方),即使把真实价格按照从低到高排序,取前1000个,动规本身也会造成超时。

第二次我在计算每件商品实际要付出的价格时,程序是这么写的

int num = 0;
for(int i&#61;0;i&#61;0&&num<1000000;j--){int t &#61; v[i]-c[j];pac[num&#43;&#43;]&#61;t;}
}

此前&#xff0c;v和c都已经从低到高排序了&#xff0c;也就是只读入最小的前100w个&#xff0c;然后使用贪心&#xff0c;只要钱足够就买入。这次没有超时。但是有一个用例是答案错误。

分析可能有两个原因&#xff1a;1.贪心本身就不科学 2.以我刚刚的计算方法&#xff0c;得到的并不是真正最小的前100w个价格。

我尝试计算出所有可能的价格&#xff0c;进行排序&#xff0c;再取前100w个&#xff0c;很遗憾&#xff0c;2个超时&#xff0c;得分甚至更低。 

我幡然醒悟&#xff0c;这题是追求最大商品个数&#xff0c;又不是价值&#xff0c;本来就不是动规问题&#xff0c;因此把价值从低到高一件件地往购物车里放就是能够得到最多商品数的策略。

问题就出在如何不超时地得到从低到高的价格排序&#xff0c;且我得到的100w是死的&#xff0c;也许它要100w&#43;1呢&#xff1f;

也就是我的26分程序丢分点可能在于&#xff1a;1.不是严格的小到大价格排序 2.给出的价格排序满足时间复杂度但是剩余的钱还能买

怎么办&#xff1f;只能改成动态的。

友情外链&#xff1a;浙江大学软件学院2020年保研上机模拟练习

我参考上面那位仁兄的思路&#xff0c;主要改进的地方是&#xff0c;使用了优先队列&#xff0c;这样能让最低价格自动上到第一位&#xff0c;并且加入队列的准则是&#xff0c;加入上一个弹出商品次优的价格(如果还有更低的优惠券没用的话&#xff0c;要是没有就不管了)。


第一次程序

#include
#include
#include
#include
#include
#include
#include
#includeusing namespace std;const int maxn &#61; 100010;
const int inf &#61; 1000000&#43;10;//即10^6vector pac;//price after coupon
int dp[inf] &#61; {0};int n,W;
int v[maxn],c[maxn];int main(){scanf("%d %d",&n,&W);for(int i&#61;0;i&#61;pac[i];w--){dp[w] &#61; max(dp[w-pac[i]]&#43;1,dp[w]);}}int maxDp &#61; -1;int maxNum &#61; 0;for(int w &#61; 0;w<&#61;W;w&#43;&#43;){if(dp[w]>maxNum){maxNum &#61; dp[w];maxDp &#61; w;}}printf("%d %d",maxNum,W-maxDp);return 0;
}

第一次结果


 第二次程序

#include
#include
#include
#include
#include
#include
#include
#includeusing namespace std;const int maxn &#61; 100010;
const int inf &#61; 1000000&#43;10;//即10^6int pac[1000000];//price after coupon
int dp[inf] &#61; {0};int n,W;
int v[maxn],c[maxn];int main(){scanf("%d %d",&n,&W);for(int i&#61;0;i&#61;0&&num<1000000;j--){int t &#61; v[i]-c[j];pac[num&#43;&#43;]&#61;t;}}sort(pac,pac&#43;num);int left &#61; W;int iNum &#61; 0;for(int i&#61;0;i&#61;pac[i]){left-&#61; pac[i];iNum &#43;&#43;; }if(left<&#61;0)break; }printf("%d %d",iNum,left);return 0;
}


第三次程序

#include
#include
#include
#include
#include
#include
#include
#include
#includeusing namespace std;const int maxn &#61; 100010;
const int SUP &#61; 2000000000;int n,t;
int it[maxn],co[maxn];struct price{int itIdx,coIdx,sub;price(int _it,int _co):itIdx(_it),coIdx(_co),sub(it[_it]-co[_co]){}friend bool operator <(price a,price b){return a.sub>b.sub;}
};priority_queue Q;int main(){ cin>>n>>t;for(int i&#61;0;i>it[i];sort(it,it&#43;n);for(int i&#61;0;i>co[i]; sort(co,co&#43;n);for(int i&#61;0;i&#61;0&&!Q.empty()){price now &#61; Q.top();if(t0)Q.push(price(now.itIdx,now.coIdx-1));}printf("%d %d\n",num,t);return 0;
}

第三次结果


推荐阅读
  • 开发心得:成为SGU475智能筏工的策略与技巧 ... [详细]
  • 在解决区间相关问题时,我发现自己经常缺乏有效的思维方式,即使是简单的题目也常常需要很长时间才能找到解题思路,而一旦得到提示便能迅速理解。题目要求对一个包含n个元素的数组进行操作,并给出一个参数k,具体任务是…… ... [详细]
  • SRM 553:深入解析供应链管理系统的最新进展与应用本文详细探讨了供应链管理系统(SCM)的最新发展及其在实际应用中的影响。通过对当前技术趋势的分析,文章揭示了 SCM 在提高效率、降低成本和增强透明度方面的关键作用。此外,还介绍了几种创新的 SCM 解决方案,如区块链技术和人工智能的应用,以及这些技术如何帮助企业更好地应对市场变化和挑战。 ... [详细]
  • C++入门必备:首个博客知识点汇总
    本文总结了C++初学者需要掌握的关键知识点,特别强调了成员类型的区分。其中,protected成员与private成员在本类中的作用相同,但protected成员允许派生类的成员函数访问,而private成员则不允许。此外,文章还介绍了其他重要的C++基础概念,如类的构造函数、析构函数以及继承机制,为初学者提供了一个全面的学习指南。 ... [详细]
  • HDU1176:免费馅饼问题的动态规划解法分析
    题目“免费馅饼”通过动态规划方法进行了解析。该问题的时间限制为 Java 2000ms 和其他语言 1000ms,内存限制为 Java 65536K 和其他语言 32768K。本文详细探讨了如何利用动态规划算法高效求解此问题,并对算法的时间复杂度和空间复杂度进行了深入分析。此外,还提供了具体的实现步骤和代码示例,帮助读者更好地理解和应用这一方法。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 本文详细解析了九度编程平台上的斐波那契数列高效算法挑战(题目编号:1387)。该挑战要求在1秒的时间限制和32兆的内存限制下,设计出高效的斐波那契数列计算方法。通过多种算法的对比和性能分析,本文提供了优化方案,帮助参赛者在限定资源条件下实现高效计算。 ... [详细]
  • 如何利用正则表达式(regexp)实现高效的模式匹配?本文探讨了正则表达式在编程中的应用,并分析了一个示例程序中存在的问题。通过具体的代码示例,指出该程序在定义和使用正则表达式时的不当之处,旨在帮助读者更好地理解和应用正则表达式技术。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 探索偶数次幂二项式系数的求和方法及其数学意义 ... [详细]
  • 《Intel IA-32 架构软件开发人员手册详尽指南》提供了详尽的 IA-32 架构技术文档,涵盖指令集、系统编程和硬件接口等内容,为软件开发人员提供全面的技术支持和参考。该手册不仅包括详细的架构说明,还提供了丰富的编程示例和最佳实践,帮助开发人员更好地理解和应用 IA-32 架构。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • 字节码开发笔记:深入解析与应用技巧 ... [详细]
  • 本文详细介绍了 Windows API 中的按钮控件及其应用实例。主要功能包括:1. `CheckDlgButton` 用于更改对话框中按钮的选中状态;2. `CheckRadioButton` 用于设置单选按钮的选中状态。此外,还探讨了按钮控件在实际开发中的多种应用场景,帮助开发者更好地理解和使用这些功能。 ... [详细]
author-avatar
liqiqinai
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有