4245. 【五校联考6day2】er (Standard IO)

Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits

Description

小明在业余时间喜欢打电子游戏,不是星际和魔兽这些,是赛尔号一类的游戏。最近小明在玩一款新出的游戏,叫做■■■■■■■■。小明觉得游戏里自己的装备太垃圾了,每次都被大神虐,一怒之下充了■■元准备强化装备。
这个游戏中用于强化装备的道具叫做强化符文。有以下3 种:
1. 赋值强化符文,对某个装备使用这个符文以后,装备威力值会变为一个常数。因为这个功能很IMBA,可以让一个垃圾装备变得非常牛■,所以它在游戏里很稀有,市场上最多能见到一个。
2. 加法强化符文,对某个装备使用后,威力值加上一个常数。
3. 乘法强化符文,对某个装备使用后,威力值乘上一个常数。
市场上有M 个不同强化符文可以购买,小明有N 件装备准备强化,他只能购买K 个强化符文,然后以任意顺序使用这些符文,强化他的任意装备(一个装备可以不强化也可以强化多次)。根据游戏的设定,所有装备威力值乘积为总效果。请为他设计一个购买和强化方案,使强化后的所有装备总效果值最大。
由于小明RP 不太好,打BOSS 都不掉神装,所以他的装备不超过两件。

Input

第一行3 个正整数N;M;K, 含义见题面。
第二行N 个正整数Ai,表示他的每个装备的初始威力值。
第三行开始共M 行,每行两个正整数Type_i;Ci,描述一个强化符文。Type_i表示符文类型,1 表示赋值,2 表示加法,3 表示乘法。Ci 是对应的常数值。

Output

一个数,表示最大的总效果值。由于这个数可能很大,请输出它的自然对数,保留3 位小数。

Sample Input

2 5 3
0 1
2 3
2 1
2 4
3 4
3 2

Sample Output

4.159

Data Constraint

对于20% 的数据,N = 1;
对于全部数据M,K ≤ 100;N ≤ 2,最多一个Type_i = 1。
输入数据中所有数不超过2000。

Source / Author: 谷晟 er

本来没看到n<=2,以为n<=100,但考场仍打了一个n^3程序,以为稳稳过。

结果不遂。

当时的思路:

显然,我们先将加法操作,乘法操作分别存在两个数组里,然后排降序。

对于赋值操作,若是在加完乘完后赋值,显然对答案没有意义。

对于乘法操作,注意到最终的答案是乘积,因此给谁乘对答案没影响。

那我们可以枚举加法操作。

i枚举用几个加法操作。

至于这i个加给谁,我想到当a+b = c+d 两个更接近的乘积更大。

例子:

2*5 = 10,3*4 =12

显然后者两个挨得更近,乘积更大。

于是我就想办法让小的变大,具体地,将当前要加上的值给最小的a。

最小值用set维护一下,找最小的时间就接近常数了。

然后把得到的答案存进f里,f[i]表示已经用了i次机会的最大乘积。

最后枚举一个用乘的个数,配合f算答案。

具体见80分程序:(考场50分,后来改了点细节就80了)

#include<bits/stdc++.h>
#define N 210
#define inf 2147483647
#define rint register ll
#define ll long long
#define point(a) multiset<a>::iterator
#define mod (ll)(998244353)
#define mem(a,b) memset(a,b,sizeof (a))
#define mcy(a,b) memcpy((a) , (b) ,sizeof (a));
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;struct node
{   int id,v;bool operator < (const node b)const{node a=*this;return a.v < b.v;}
};int n,m,k,i,j,l;
int sk[N][2],t1[N],t2[N],t3[N],a[N],t[N];
long double f[N],pre[N],ans,tmp;
multiset<node> s;bool cmp(int a,int b)
{return a>b;}int main()
{
//  printf("%.3lf",log(1) );scanf("%d%d%d",&n,&m,&k);for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=1;i<=m;i++)scanf("%d%d",&sk[i][0],&sk[i][1]);for(i=1;i<=m;i++){if(sk[i][0]==1)t1[++t1[0]]=sk[i][1];if(sk[i][0]==2)t2[++t2[0]]=sk[i][1];if(sk[i][0]==3)t3[++t3[0]]=sk[i][1];}sort(t2+1,t2+1+t2[0],cmp);sort(t3+1,t3+1+t3[0],cmp);for(i=1;i<=t3[0];i++)pre[i] = pre[i-1] + log(t3[i]);//使用赋值强化mcy(t,a);if(t1[0]){for(i=1;i<=n;i++){a[i]=t1[1];s.clear();for(j=1;j<=n;j++)if(j!=i)s.insert((node){j,a[j]});tmp=0;for(j=1;j<=n;j++)tmp+=log(a[j]);f[1] = max(f[1] , tmp); //不加法 for(j=1;j<=t2[0];j++)if(1+j<=k){    point(node) it=s.begin();node now = *it; if(it!=s.end())s.erase(it);a[now.id]+=t2[j];  s.insert((node){now.id,a[now.id]});long double   sum=0.0;for(l=1;l<=n;l++)sum = sum + log(a[l]);f[1+j] = max(f[1+j] , sum);}mcy(a,t);}}//不使用 s.clear();tmp=0;for(j=1;j<=n;j++)s.insert((node){j,a[j]}),tmp+=log(a[j]);f[0] = max(f[0] , tmp);for(j=1;j<=t2[0];j++)if(j<=k){point(node) it=s.begin();node now = *it; s.erase(it);a[now.id]+=t2[j];    s.insert((node){now.id,a[now.id]});long double  sum=0.0;for(l=1;l<=n;l++)sum = sum + log(a[l]);f[j] = max(f[j] , sum);} else break;mcy(a,t);for(i=0;i<=t3[0];i++)if(k-i >= 0) ans = max(ans , f[k-i] + pre[i]); printf("%.3lf\n",(double)ans);return 0;
}

是不是看起来很蠢。

总而言之,这种贪心思想是错的,有待证明,希望读者能帮着抠抠错误,程序上的也可以。

Ac做法:

排序加和乘操作,算前缀和,前缀积。

分别讨论n==1,和n==2的答案.

n==1显然。

n==2我们先要做一做dp

f[i][j] 表示 用了前i个加法操作,a[1]=j 时,a[2]的最大值。

转移显然。

然后枚举i,枚举j,i,j的意思就是f两个纬度分别代表的意思。

当然,以上讨论避开了自然对数的问题。

注意赋值操作的神奇性。

#include<bits/stdc++.h>
#define N 110
#define Q 200000
#define inf 2147483647
#define rint register ll
#define ll long long
#define lb long double
#define point(a) multiset<a>::iterator
#define mod (ll)(998244353)
#define mem(a,b) memset(a,b,sizeof (a))
#define mcy(a,b) memcpy((a) , (b) ,sizeof (a));
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;int n,m,k,i,j,tl;
int opt,cst ,m2,m3;
int fff,t2[N],t3[N],sum[N],f[N][N*2000],a[3];
lb ans,pro[N];
bool cmp(int a,int b)
{return a>b;}
void init()
{sort(t3+1,t3+1+m3,cmp);sort(t2+1,t2+1+m2,cmp);for(i=1;i<=m2;i++)sum[i] = sum[i-1]  + t2[i];for(i=1;i<=m3;i++)pro[i] = pro[i-1]  + log(t3[i]);
}void dp()
{mem(f,-1);f[0][a[1]]=a[2]; for(i=1;i<=m2;i++)for(j=0;j<=Q;j++)if(j - t2[i]>=0) {int x=-1;x= f[i-1][j-t2[i]]>0 ? f[i-1][j-t2[i]] :x;x= f[i-1][j] >0 ? max(x,f[i-1][j] + t2[i]) :x;f[i][j]=x;}return ;
}int main()
{open("game");scanf("%d%d%d",&n,&m,&k);for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=1;i<=m;i++){scanf("%d%d",&opt,&cst);if(opt==1)fff=cst ; elseif(opt==2)t2[++m2]=cst; elset3[++m3]=cst;}init(); //sum , proif(n==1){for(i=0;i<=k;i++)   ans = max(ans , 1.0 * log(a[1] + sum[i]) + pro[k-i]);a[1] = fff;for(i=0;i<k;i++)  ans = max(ans , 1.0 * log(a[1] + sum[i]) + pro[k-i-1]);}else{dp();int cf = min(k , m2);for(i=0;i<=cf;i++)for(j=0;j<=Q;j++) //枚举a[1]是几 if(f[i][j] > 0)ans = max(ans , pro[k-i] + log(j*f[i][j]) ); else if(f[i][j]==0) ans = max(ans , pro[k-i] ); if(a[1] < a[2])a[1]=fff; else a[2]=fff;dp();for(i=0;i<=cf;i++)for(j=0;j<=Q;j++) //枚举a[1]是几 if(k-i-1>=0){if(f[i][j] > 0 )  ans = max(ans , pro[k-i-1] + log(j*f[i][j]) ); else if(f[i][j]==0) ans = max(ans , pro[k-i-1] ); }}printf("%.3lf",(double)ans);return 0;}

t2[i]是加第i个加法操作的权值。

4245. 【五校联考6day2】er相关推荐

  1. 4246. 【五校联考6day2】san (Standard IO)

    4246. [五校联考6day2]san (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits D ...

  2. JZOJ 4245【五校联考6day2】er

    吐槽:这题目起的好随便啊 原题 小明在业余时间喜欢打电子游戏,不是星际和魔兽这些,是赛尔号一类的游戏.最近小明在玩一款新出的游戏,叫做■■■■■■■■.小明觉得游戏里自己的装备太垃圾了,每次都被大神虐 ...

  3. 【五校联考6day2】er

    Description 小明在业余时间喜欢打电子游戏,不是星际和魔兽这些,是赛尔号一类的游戏.最近小明在玩一款新出的游戏,叫做■■■■■■■■.小明觉得游戏里自己的装备太垃圾了,每次都被大神虐,一怒之 ...

  4. 【五校联考6day2】san

    Description 小明经常去N 个地点,其中有些地点之间有直接的无向道路(共M 条这样的道路),可以直接互相到达,这些道路的长短不一.由于小明对这些道路都很熟悉,无论起点和终点在哪里,总能走最短 ...

  5. 【五校联考6day2】yi

    Description 小明是■■■星际旅游公司的员工,负责安排飞船,有N 艘飞船由他管理,每艘飞船能容纳的人数都不同.今天小明被要求为一个去锑星的旅游团安排往返的飞船,旅游团有M人,小明希望用最少的 ...

  6. [jzoj 4246] 【五校联考6day2】san {spfa+dfs/spfa+拓扑排序+dp}

    题目 Description 小明经常去N 个地点,其中有些地点之间有直接的无向道路(共M 条这样的道路),可以直接互相到达,这些道路的长短不一.由于小明对这些道路都很熟悉,无论起点和终点在哪里,总能 ...

  7. 4246. 【五校联考6day2】san

    Description 小明经常去N 个地点,其中有些地点之间有直接的无向道路(共M 条这样的道路),可以直接互相到达,这些道路的长短不一.由于小明对这些道路都很熟悉,无论起点和终点在哪里,总能走最短 ...

  8. jzoj 4246【五校联考6day2】san

    Description 小明经常去N 个地点,其中有些地点之间有直接的无向道路(共M 条这样的道路),可以直接互相到达,这些道路的长短不一.由于小明对这些道路都很熟悉,无论起点和终点在哪里,总能走最短 ...

  9. 湖南长郡2021高考成绩查询时间,2021年湖南新高考六校、长郡十五校联考时间公布...

    2021年湖南新高考六校.长郡十五校联考时间公布 导读:距离2021年高考时间仅剩不到一百天,各个省份都的高三学子都进入紧张阶段.开始了各种模拟考试.2021届湖南省炎德英才大联考的考试时间也已经公布 ...

  10. jzoj4230. 【五校联考4day1】淬炼神体(B组——Day3)

    jzoj4230. [五校联考4day1]淬炼神体 题目 Description 王仙女将你提供的答案填在<葵花宝典>上,突然,宝典发出耀眼的白光,一股强大的吸力瞬间将仙女吸入宝典中. 一 ...

最新文章

  1. 三张图助您掌握OTN分层结构
  2. Win XP远程桌面双管理员同时登录
  3. lambda表达式可以用来声明_Lambda 的骚操作,你都get到了没
  4. 成功人士,默默做的30件事 (4-6)
  5. Oracle日志分类
  6. Camparable与Comparator之区别
  7. selenium 基于浏览器驱动测试
  8. ADO.NET Entity Framework 学习
  9. python求5_Python 5 运算符
  10. linux的python开发环境_linux下python开发环境之一——安装python
  11. TigerGraph入门
  12. 函数指针和指针函数用法和区别
  13. Android 视频和图片轮播控件,仿淘宝商品详情页
  14. 个人技术博客的选择:CSDN、博客园、简书、知乎专栏、Github、新浪、个人建站等?
  15. vue中进度条写法_Vue进度条progressbar组件功能
  16. Win7定时任务——提醒自己喝水
  17. 计算机音乐简单教学反思,《音乐小屋》教学反思
  18. c语言自定义函写计算器,C语言实现计算器功能
  19. 使用Python获取bing壁纸接口
  20. 基于深度学习的旋翼无人机机械臂抓取

热门文章

  1. word公式编辑器出错及交叉引用问题
  2. 饭饭的Selenium+xlwt笔记
  3. html中绝对定位的父级,【CSS学习笔记】绝对定位的父类参照物的确定
  4. 番茄花园 产业链 洪磊 中国
  5. 38.状态保持之Session详解
  6. 一个基于WinHttp的轻量级的分片下载库介绍
  7. 【接口协议】FPGA 驱动 VGA 显示实验(一)原理部分
  8. 克拉克松Clarkson Research情报网注册登录及进行数据查询(以世界造船厂分布为例)
  9. 怎么刷android10,安卓10的刷机教程,教你刷好Killer的精简包
  10. 在计算机操作中粘贴的快捷键是什么,复制粘贴的快捷键,详细教您电脑怎么使用快捷键复制粘贴...