[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. 无责任共享 Coursera、Udacity 等课程视频(转载)

    转载链接:https://www.zybuluo.com/illuz/note/71868 B站计划:https://www.zybuluo.com/illuz/note/832995#cs基础课程

  2. flask_restplus(1)- 未完成

    快速开始 本指南假设您对Flask有一定的了解,并且您已经安装了Flask和Flask- restplus.如果没有,则按照安装部分中的步骤操作. 初始化 与其他所有扩展一样,您可以使用应用程序对象初 ...

  3. 【转】理解*(void**)

    #include <stdio.h> int main() { int *p; ; unsigned ; p = &a; printf("%d\n", *p); ...

  4. 去除Many2one字段的“创建并编辑”选项

    要去除Many2one字段的“创建并编辑”选项,只要在view.xml里对应的field定义里增加options="{'no_create_edit':1}即可 <field name ...

  5. centos7.2环境中kettle环境搭建及任务推送配置详解

    目标:将mysql5.5中testdb1的ehr_user表推送到tdoa的ehr_user表中,为避免不必要的麻烦,两张表结构.编码,包括数据库编码保持一致 操作系统:centos7.2 kettl ...

  6. Ex 6_17 数量无限的硬币兑换问题_第七次作业

    子问题定义:定义一个数组b,大小比兑换价格的大小多一个元素,其中b[i]表示是否能用面值为x1,x2,x3,..,xn的硬币兑换价格i. 递归关系: 初值设定:设b[0]=true 求解顺序:按下标从 ...

  7. 简单对比 Libevent、libev、libuv

    Libevent.libev.libuv三个网络库,都是c语言实现的异步事件库Asynchronousevent library). 异步事件库本质上是提供异步事件通知(Asynchronous Ev ...

  8. js实现页面重定向

    在现行的网站应用中URL重定向的应用有很多: 404页面处理.网址改变(t.sina转到weibo.com).多个网站地址(如:http://www.google.com/ .www.g.cn )等: ...

  9. 《java程序设计》结对编程-四则运算整体总结

    需求分析(描述自己对需求的理解,以及后续扩展的可能性) 实现一个命令行程序,要求: 自动生成小学四则运算题目(加,减,乘,除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 ...

  10. WPF 绑定 验证

    <TextBox Grid.Column="1" Margin="1" Text="{Binding Name, ValidatesOnExce ...