[CF521D]Shop

题目大意:

你有一个长度为\(k(k\le10^5)\)的数列\(A_{1\sim k}\),有\(n(n\le10^5)\)种操作,操作包含以下\(3\)种:

  1. 将\(A_x\)变成\(y\);
  2. 将\(A_x\)加上\(y\);
  3. 将\(A_x\)乘以\(y\)。

定义这个数列的收益为各项之积,你可以从中选\(m\)个操作(每个操作至多选\(1\)次),使得收益最大,求任一操作的方案。

思路:

贪心,对于只有操作\(3\)的情况,显然从大到小贪心更优。

而操作\(2\)可以转化成操作\(3\),操作\(1\)又可以转化成操作\(2\),因此最后还是可以用同样的方式贪心。

源代码:

#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<algorithm>
#include<functional>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
typedef long long int64;
const int N=1e5+1;
int ans[N];
std::pair<int,int> b[N];
struct Modify {
int a,b,c;
bool operator > (const Modify &rhs) const {
return c>rhs.c;
}
};
Modify q[N];
std::vector<std::pair<int,int> > v[N];
struct Node {
int id;
double c;
bool operator < (const Node &rhs) const {
return c<rhs.c;
}
};
std::priority_queue<Node> h;
inline bool cmp(const int &i,const int &j) {
return q[i].a<q[j].a;
}
int main() {
const int k=getint(),n=getint(),m=getint();
for(register int i=1;i<=k;i++) {
v[i].push_back(std::make_pair(getint(),0));
}
for(register int i=1;i<=n;i++) {
q[i].a=getint();
q[i].b=getint();
q[i].c=getint();
if(q[i].a==1) {
b[q[i].b]=std::max(b[q[i].b],std::make_pair(q[i].c-v[q[i].b][0].first,i));
}
if(q[i].a==3) {
h.push((Node){i,1.*q[i].c});
}
}
for(register int i=1;i<=k;i++) {
if(b[i].first>0) v[i].push_back(b[i]);
}
for(register int i=1;i<=n;i++) {
if(q[i].a==2) {
v[q[i].b].push_back(std::make_pair(q[i].c,i));
}
}
for(register int i=1;i<=k;i++) {
std::sort(v[i].begin()+1,v[i].end(),std::greater<std::pair<int,int> >());
int64 sum=v[i][0].first;
for(register unsigned j=1;j<v[i].size();j++) {
h.push((Node){v[i][j].second,1.*(sum+v[i][j].first)/sum});
sum+=v[i][j].first;
}
}
for(register int i=1;!h.empty()&&i<=m;i++) {
ans[++ans[0]]=h.top().id;
h.pop();
}
if(ans[0]==0) {
puts("0");
return 0;
}
std::sort(&ans[1],&ans[ans[0]]+1,cmp);
for(register int i=0;i<=ans[0];i++) {
printf("%d%c",ans[i]," \n"[!(i%ans[0])]);
}
return 0;
}

[CF521D]Shop的更多相关文章

  1. CF521D Shop 贪心

    题意: \(n\)个数,有\(m\)个操作,形如: 1,将\(x_i\)​改成\(val_i\)​ 2,将\(x_i\)加上\(val_i\)​ 3,将\(x_i\)​乘上\(val_i\) 其中第\ ...

  2. 「CF521D」 Shop

    「CF521D」 Shop 传送门 题目说是有三种操作,首先可以知道赋值操作是可以转化为加法操作的,即 \((1,b) \rightarrow (2,b-a_i)\) 然后加法对于一个数你肯定优先选择 ...

  3. 「CF521D」Shop

    传送门 Luogu 解题思路 当只有第三类操作时,我们显然先进行val较大的操作,这是显然的. 那么就考虑把所有的操作都转变为第三类操作. 第一类操作,显然很容易变为第二类操作:单点维护最大的最终结果 ...

  4. codeforces 632+ E. Thief in a Shop

    E. Thief in a Shop time limit per test 5 seconds memory limit per test 512 megabytes input standard ...

  5. Codeforces632E Thief in a Shop(NTT + 快速幂)

    题目 Source http://codeforces.com/contest/632/problem/E Description A thief made his way to a shop. As ...

  6. poj1157LITTLE SHOP OF FLOWERS

    Description You want to arrange the window of your flower shop in a most pleasant way. You have F bu ...

  7. Magicodes.Shop——版本历史

    Magicodes.Shop为湖南心莱信息科技有限公司(xin-lai.com)Magicodes系列产品之一. 产品中引用的Magicodes系列Nuget包的开源库地址为:https://gith ...

  8. sgu 104 Little shop of flowers 解题报告及测试数据

    104. Little shop of flowers time limit per test: 0.25 sec. memory limit per test: 4096 KB 问题: 你想要将你的 ...

  9. PHP Yii1.1.13(一):命令行创建应用~shop

    第一节 初始目录结构 (1)初识目录结构 在创建应用之前,我们来看一下Yii 1.x版本的目录结构:将yii-1.1.13安装文件解压到网站根目录下,打开framework目录,其目录如下图所示 (2 ...

随机推荐

  1. C语言表驱动法编程实践

    数据压倒一切.如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明.编程的核心是数据结构,而不是算法. ——Rob Pike  说明 本文基于这样的认识:数据是易变的,逻辑是稳定的. ...

  2. 【实践】Matlab2016a的mdce集群搭建

    Matlab R2016a的mdce集群搭建 1.解压文件Matlab_R2016b_win64.iso. 文件下载地址:链接:https://pan.baidu.com/s/1mjJOaHa 密码: ...

  3. 基于内容的图片检索CBIR简介

    原文地址:http://blog.csdn.net/davebobo/article/details/53171311 传统的图像检索过程,先通过人工对图像进行文字标注,再利用关键字来检索图像,这种依 ...

  4. (常用)re模块

    re模块(正则)#re:一些带有特殊含义的符号或者符号的组合#为什么要用re:一堆字符串中找到你所需要的内容,过滤规则是什么样,通过re模块功能来告诉计算机你的过滤规则#应用:在爬虫中最为常用:使用爬 ...

  5. redux最佳实践

     对于初学者,redux的理念很难理解.其实redux并不难,redux核心理念就是数据仓库,所有数据操作来源都是明确的.只不过不是直接操作数据,而是交给特定的角色做特定的工作,分工明确.   pro ...

  6. 使用navicat premium将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL

    有时候我们有迁移数据库的需求,例如从Oracle迁移到SQL Server,或者从MySQL迁移到Oracle. 很多江湖好汉一时不知如何手工操作,所幸的是Navicat提供了迁移的自动化操作界面. ...

  7. hdu2586 lca倍增法

    倍增法加了边的权值,bfs的时候顺便把每个点深度求出来即可 #include<iostream> #include<cstring> #include<cstdio> ...

  8. 性能测试三十二:监控之Java线程监控

    线程的五种状态 * 新建:new * 运行:runnable * 等待:waitting(无限期等待),timed waitting(限期等待) * 阻塞:blocked * 结束:terminate ...

  9. python接口自动化测试二十二:文件下载

    文件下载类型: Content-Type: octets/stream   一般为文件类型:

  10. python 全栈开发,Day31(re模块)

    回顾昨天的内容 异常处理 try except 一定要在except之后写一些提示或者处理的内容 try: '''可能会出现异常的代码''' except ValueError: '''打印一些提示或 ...