当前位置: 首页 > 编程日记 > 正文

JZOJ 5461 购物 —— 贪心

题目:https://jzoj.net/senior/#main/show/5461

贪心,原来想了个思路,优先选优惠价最小的 K 个,然后其他按原价排序遍历;

如果当前物品没选过,原价选上,如果选过,考虑把它换成原价,然后把优惠价最小的下一个选上;

但这样做是75分,没考虑 替换没选过的物品 和 比较替换后是否更优;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
int const maxn=5e4+5;
int n,K,cnt;
ll m,ans;
bool vis[maxn];
struct N{int w,t,id;bool operator < (const N &y) const{return w>y.w;}
}p[maxn];
priority_queue<N>q;
bool cmp(N x,N y){return x.t<y.t;}
int main()
{freopen("shopping.in","r",stdin);freopen("shopping.out","w",stdout);scanf("%d%d%lld",&n,&K,&m);for(int i=1;i<=n;i++)scanf("%d%d",&p[i].w,&p[i].t);sort(p+1,p+n+1,cmp);for(int i=1;i<=n;i++)p[i].id=i,q.push(p[i]);for(int i=1;i<=K&&i<=n;i++){    if(ans+p[i].t>m)break;vis[i]=1; cnt=i; ans+=p[i].t;}if(cnt==n){printf("%d\n",n); return 0;}while(q.size()){int x=q.top().id,w=q.top().w,t=q.top().t; q.pop();if(!vis[x]){if(ans+w>m)continue;ans+=w; cnt++; }else{if(ans-p[x].t+p[x].w+p[K+1].t>m)continue;ans=ans-p[x].t+p[x].w+p[K+1].t; K++; cnt++;vis[x]=0; vis[K]=1;}}printf("%d\n",cnt);return 0;
}

正解是直接把选中物品的 原价 - 优惠价 放入小根堆,然后其他物品按原价排序,直接判断、替换;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
int const maxn=5e4+5;
int n,K,cnt;
ll m,ans;
bool vis[maxn];
struct N{int w,t,id;}p[maxn];
priority_queue<int>q;
bool cmp(N x,N y){return x.t<y.t;}
bool cmp2(N x,N y){return x.w<y.w;}
int main()
{
//    freopen("shopping.in","r",stdin);
//    freopen("shopping.out","w",stdout);scanf("%d%d%lld",&n,&K,&m);for(int i=1;i<=n;i++)scanf("%d%d",&p[i].w,&p[i].t),p[i].id=i;sort(p+1,p+n+1,cmp);for(int i=1;i<=K&&i<=n;i++){    if(ans+p[i].t>m)break;cnt=i; ans+=p[i].t; q.push(p[i].t-p[i].w); vis[p[i].id]=1;}if(cnt==n){printf("%d\n",n); return 0;}sort(p+1,p+n+1,cmp2);for(int i=1,x;i<=n;i++){if(vis[p[i].id])continue;if(q.size()){x=-q.top();if(x+p[i].t>p[i].w&&ans+p[i].w<=m)ans+=p[i].w,cnt++;else if(x+p[i].t<=p[i].w&&ans+x+p[i].t<=m)ans+=x+p[i].t,cnt++,q.pop(),q.push(p[i].t-p[i].w);}else if(ans+p[i].w<=m)ans+=p[i].w,cnt++;} printf("%d\n",cnt);return 0;
}
TJ

但这样总感觉不对,因为按原价排序并不能保证替换最优;

这里就是反例:

6 3 15

10 3

8 4

7 5

5 1

4 2

3 2

按这样的做法,会先选后3个物品,然后按 1,2,3 把前三个物品排序;

然后把物品6换成原价购买,优惠价购买物品 3;

之后就不能买了,输出4;

但实际上应该是优惠价购买物品 1,2,4,原价购买物品 5,6,答案是5;

 所以应该采用别的贪心策略,看到了一种很好的:https://blog.csdn.net/qq_40448823/article/details/81488195 (不过这篇博客贴错题面了囧)

所有物品都按优惠价排序,同时开了一个原价购买的大根堆,存已经原价买下的东西的原价;

先买 K 个优惠价的,然后从优惠价排序的顺序继续往后看,每次去掉优惠买中 原价 - 优惠价 最小的一个,优惠价买下一个;

然后回头看看能否原价买上去掉的这个东西,能就原价买上,不能就去原价物品堆里看看,如果能替换一下使花钱更少,那么就替换一下;

而如果优惠价购买下一个不如原价购买下一个优,那么原价购买下一个,同样进行替换的判断;

然后就能过掉上面的数据了,主要是因为优惠价部分排序满足,原价部分用大根堆替换来满足;

不过数据太水,也不知道这个做法是否完美无瑕,看样子应该没问题,先放到这里吧。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
int const maxn=50005;
int n,K,ans;
ll sum,m;
struct N{int w,t,c;bool operator < (const N &y) const{return c>y.c;}
}p[maxn];
priority_queue<N>Q;
priority_queue<int>q;
bool cmp(N x,N y){return x.t<y.t;}
int main()
{freopen("shopping.in","r",stdin);freopen("shopping.out","w",stdout);scanf("%d%d%lld",&n,&K,&m);for(int i=1;i<=n;i++)scanf("%d%d",&p[i].w,&p[i].t),p[i].c=p[i].w-p[i].t;sort(p+1,p+n+1,cmp);for(int i=1;i<=n;i++){if(Q.size()<K&&sum+p[i].t<=m){sum+=p[i].t; ans++; Q.push(p[i]);}//Q是按差价排序的堆 else if(Q.size()==K)//其他物品是按优惠价排序的 
        {N x=Q.top();if(x.c+p[i].t<=p[i].w)//优惠价购买较优 
            {Q.pop(); Q.push(p[i]); sum=sum-x.t+p[i].t;//先优惠价买上 if(sum+x.w<=m){sum+=x.w; ans++; q.push(x.w);}//可以原价买原来那个 //q是原价购买了的堆 else if(q.size()&&q.top()>x.w){sum=sum-q.top()+x.w; q.pop(); q.push(x.w);}//不能买了,换掉之前原价购买的一个物品,可以更优
            }else if(sum+p[i].w<=m){sum+=p[i].w; ans++; q.push(p[i].w);}//原价购买 else if(q.size()&&q.top()>p[i].w){sum=sum-q.top()+x.w; q.pop(); q.push(x.w);}//不能买了,替换更优 
        }}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Zinn/p/9439885.html

相关文章:

matlab中的expotest,提高Fortran矩阵指数性能(Expokit比Matlab、Python慢)

我正在进行一个模拟&#xff0c;其中的瓶颈是执行大量复杂的双精度矩阵指数运算&#xff0c;我发现Fortran(Expokit)对于小矩阵很好&#xff0c;但对于较大的矩阵&#xff0c;它的性能比Matlab或Python差。在我在下面包含了一个显示类似行为的模型程序&#xff0c;尽管它需要更…

Win7下使用Putty代替超级终端通过COM串口连接开发板方法

1、如果电脑&#xff08;笔记本&#xff09;没有串口接口&#xff0c;则需要使用一个 USB-Serial 转换线&#xff0c;这里使用 prolific usb-serial USB--串口转换线&#xff0c;首先需要在win7上安装对应的 USB--串口转换线 驱动程序&#xff0c;PL2303_Prolific 驱动程序下载…

java内部类 缺点_Java中的内部类及其优势

Java中提供了定义内部类的选择&#xff0c;这一机制使得代码的书写更为方便和优雅(功能上相关的代码被紧密的组织在了一起)。需要注意的是&#xff0c;内部类和传统的组合(即将一个类的实体定义为另一个类的成员)是完全不同的&#xff0c;其主要特性表现在以下的一些方面&#…

php webapi验签,Asp.netCore3.0 WebApi从0到1手摸手教你写【5】增加接口参数签名验证...

通过前几个教程的学习&#xff0c;对webapi的编写基本上就可以入门了&#xff0c;可以做项目了&#xff0c;今天我们再给接口加个参数签名认证&#xff0c;之前的接口相当于赤果果的暴露在了网络上&#xff0c;只要知道接口地址、接口调用方式和传参就可以畅所欲为的调用接口了…

点击TableView任一行跳转详情页面会跳转两次的解决办法

在做TableView跳转的时候&#xff0c;发现实际上生成了两个detail view。我 navigate back 的时候&#xff0c;也是先看到一次detail view&#xff0c;然后才回到tableView的。 这是因为&#xff1a;performSegue(withIdentifier: , sender: ) 和 prepare(for segue: , sender:…

dos环境下mysql的访问_MYSQL dos环境下使用

有很多朋友虽然安装好了mysql但却不知如何使用它。在这篇文章中我们就从连接MYSQL、修改密码、增加用户等方面来学习一些MYSQL的常用命令。一、连接MYSQL。格式&#xff1a; mysql -h主机地址 -u用户名 &#xff0d;p用户密码1、例1&#xff1a;连接到本机上的MYSQL。首先在打开…

jemeter监听器的使用

打开jemeter&#xff0c;新建线程组&#xff0c;添加http请求&#xff0c;在请求下添加监听器&#xff1a; 一、添加一个jpgc - PerfMon Metrics Collector监听器&#xff1a; 服务器性能监测控件&#xff0c;包括CPU,memory&#xff08;内存&#xff09;,network&#xff29;/…

java 抛异常给上级_java异常处理机制(示例代码)

Exception 类的层次java中所有的异常类是从 java.lang.Exception 类继承的子类。而Exception 类是 Throwable (可抛出的)类的子类。除了Exception类外&#xff0c;Throwable还有一个子类Error 。Java 程序通常不捕获错误。错误一般发生在严重故障时&#xff0c;它们在Java程序处…

前端开发之JavaScript基础篇一

主要内容&#xff1a; 1、JavaScript介绍 2、JavaScript的引入方法和输出及注释 3、javaScript变量和命名规则 4、五种基本数据类型 5、运算符 6、字符串处理 7、数据类型转换 一、JavaScript介绍 1、JavaScript是什么&#xff1f;     javaScript是一种web前端的描述语言&…

v9php 碎片信息,phpcms v9碎片管理及调用技巧分享

今天在这里将分享下Phpcms V9碎片管理及调用技巧。这是关于模板数据自定义、方便客户在后台管理数据调用的一个技巧。在给客户定制模板的时候&#xff0c;往往会涉及到的一个问题就是&#xff1a;有些数据(图片文字&#xff0c;比如LOGO、侧栏的联系方式、首页的幻灯片切换Bann…

iterm2 主题_【超级实用】Iterm2 + ohmyzsh 打造强大的终端编辑器

作者&#xff1a;AndrewHR 地址&#xff1a;http://mrw.so/4D1n7B最终的效果图如下所示&#xff1a;使用iterm2配合oh-my-zsh的命令行&#xff0c;拥有语法高亮、命令自动补全、自动提示符、显示git仓库状态等功能整个配置流程1、安装iterm2首先我们下载的 iterm2 这个软件&…

main方法为什么是静态的

main函数其实也是所在类的一个方法&#xff0c;就比如一个类是test&#xff0c;那么该类的main其实就是test.main(String[] args)&#xff0c;众所周知如果一个方法不是静态的&#xff0c;则要先实例化该类&#xff0c;比如要这样 test tnew test(); 然后才能调用 test.main();…

java类为什么要建两个class_ClassLoader的几个概念、类和对象的解释

首先&#xff0c;转载一篇文章&#xff0c;个人认为是看到过了讲得最清楚的 XD当JVM(Java虚拟机)启动时&#xff0c;会形成由三个类加载器组成的初始类加载器层次结构&#xff1a;bootstrap classloader|extension classloader|system classloaderbootstrap classloader &#…

第四章 python的turtle库的运用

我们可以尝试用python的自带turtle库绘制一条蟒蛇 首先我们设计一下蟒蛇的基本形状 我们先把这段蟒蛇绘制的实例代码贴出来&#xff0c;各位可以在自己的本地运行一下看看效果&#xff0c;然后我们再继续分析代码&#xff1a; 1 #PythonDraw.py2 import turtle3 turtle.setup(6…

oracle导入索引b报错,impdp导入索引很慢

impdp用NETWORK_LINK从远程库导入到本地库&#xff0c;导入表的速度还正常&#xff0c;导入索引的速度特别慢。2个小时才导1300个索引。使用imp的格式&#xff1a;impdp vebackup/abc DIRECTORYDATABAK_DIR NETWORK_LINKprimarydb_link SCHEMASveasms TABLE_EXISTS_ACTIONREPLA…

新的mysql如何使用_如何使用新的MySQL更新日志

使用新的MySQL更新日志的方法未必人人都会&#xff0c;下面就教您如何使用新的MySQL更新日志的方法&#xff0c;希望对您能够有所帮助。如果你只使用一使用新的MySQL更新日志的方法未必人人都会&#xff0c;下面就教您如何使用新的MySQL更新日志的方法&#xff0c;希望对您能够…

find_in_set

在查询表中数据用 ‘,’隔开的记录时 如图所示 用like 查询auth 字段中含A5是查不出来的 如图所示 用find_in_set 可以查询出 auth字段含 ‘A5’的记录 如图所示 用法介绍&#xff1a; find_in_set 可以查询出字段内容以英文逗号隔开的记录 find_in_set(匹配值,字段名)转载于:h…

一堆棋子java代码编程_网易2018校招内推编程题-堆棋子-C++实现

0 1 3 10解法暴力枚举所有可能的点。如图所示&#xff0c;黑点为输入点。所需遍历的点为红线的交点&#xff0c;红圈表示。当时自己写的是遍历了外围红线所构成的封闭矩形里面所有的点了&#xff0c;只有60%的AC率&#xff0c;原因超时。看了康学长的代码&#xff0c;才知道有些…

linux free命令详解和使用实例(查看内存使用率)

free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。在Linux系统监控的工具中&#xff0c;free命令是最经常使用的命令之一1&#xff0e;命令格式&#xff1a; free [参数] 2&#xff0e;命令功能&#xff1a; free 命令显示系统使用和空闲的…

awk linux 获取端口号_Linux提权后获取敏感信息命令

如果不能执行的可能是不同类型的linux。系统版本?cat /etc/issuecat /etc/*-releasecat /etc/lsb-releasecat /etc/redhat-release内核版本&#xff1f;cat /proc/versionuname -auname -mrsrpm -q kerneldmesg | grep Linuxls /boot | grep vmlinuz环境变量&#xff1f;cat /…

lemp-------3多站点访问,,访问控制,,虚拟目录

基于ip vi /etc/nginx/nginx.conf server { listen 192.168.1.142:80; server_name localhost; access_log logs/host.access.log main; location / { root /web2; index index.html index.htm index.php; } error_page 500 502 503 504 /50x.html; location /50x.html { root…

oracle统计id出现次数,oracle 统计sql

oracle 统计月平均交易次数 &#xff1a;select n_tsc_src_usr_id , floor(count(c_tsc_no)/trunc(months_between(max(d_tsc_req_time),min(d_tsc_req_time))))from tbl_tsc_basegroup by n_tsc_src_usr_idhaving months_between(max(d_tsc_req_time),min(d_tsc_req_time)) &g…

java避免使用orderby_java – Spring安全配置@Order不是唯一的例外

我试图在我的Spring Security配置中注册多个过滤器,但是我总是得到相同的异常&#xff1a;04-Nov-2015 14:35:23.792 WARNING [RMI TCP Connection(3)-127.0.0.1]org.springframework.web.context.support.AnnotationConfigWebApplicationContext.refreshException encountered…

es 启动问题

max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] vim /etc/security/limits.conf 文件末尾添加&#xff1a; mst hard nofile 65536 mst soft nofile 65536 mst是es启动用户 max virtual memory areas vm.max_map_count [65…

imrot matlab,Matlabtuxiangpipei

文件名大小更新时间Matlab图像匹配的都可以用的到做三维重建\matlabcode\examples-code\11.jpg.......................................\..........\.............\addons\rectifData.mat.......................................\..........\.............\......\shelves.jp…

mysql 5.7 full_MySQL5.7默认打开ONLY_FULL_GROUP_BY 解决方案

MySQL5.7后将sql_mode的ONLY_FULL_GROUP_BY模式默认设置为打开状态&#xff0c;这样一来&#xff0c;很多之前的sql语句可能会出现错误&#xff0c;错误信息如下&#xff1a;Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggreg…

通过web sql实现增删查改

<!DOCTYPE html><html><head lang"en"> <meta charset"UTF-8"> <title></title></head><body><h3>***添加学生***</h3>学号&#xff1a;<input type"text" id"id&qu…

java发送苹果消息慢_Spring-boot JMS 发送消息慢的解决方法

Spring-boot JMS 发送消息慢的问题解决Servicepublic class Producer {Autowiredprivate JmsMessagingTemplate jmsTemplate;public void sendMessage(Destination destination, final String message){jmsTemplate.convertAndSend(destination, message);}}经使用JMeter进行压…

快速幂 + 矩阵快速幂

快速幂 1 #include<iostream>2 #include<algorithm>3 #include<cstring>4 #define LL long long5 using namespace std;6 7 LL Pow(LL a, LL b)8 {9 LL ans 1; 10 while(b ! 0){ 11 if(b&1) 12 ans * a; 13 a …

【Ctsc2011】幸福路径

题目链接&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id2306 给定一张有向图&#xff0c;每个点有权值&#xff0c;蚂蚁从某个节点出发&#xff0c;初始体力值为$1$&#xff0c;每走一条边$体力值*p$&#xff0c;每经过一个点会获得幸福值为$点权*体力值$&…