Educational Codeforces Round 91 (Rated for Div. 2) D.Berserk And Fireball(思维,暴力破解,分情况)
题目传送
题意:
现在有一个排列,再给出一个删除后的数组,删除操作只有俩种:一种是,选择连续的k个数,删除,消耗x点代价。另一种是,选择连续的俩个数,删除其中小的数,消耗y点代价。现在问,能否得到删除后的数组,如果不能输出-1,如果能,请打出最小代价。
思路:
很明显就是分情况操作,先记录下,每个数的位置,然后在删除后的数组中对应起来,看删除的哪些数,枚举删除的数的最大值(这里要注意,因为区间不会重复,所以我们暴力枚举最大值,最坏也就总共2e5次操作),再看删除的这些数是否满足删除条件。
1.如果y*k大于等于x,那么肯定是代价最小的(每次选择连续的俩个数),但是我们要观察是否满足删除条件,条件:左端点,或者右端点的值要大于这之间的最值
**(1)**如果满足这个条件,那么直接删用y代价,删除端点中间的数即可
(2)如果不满足,那么我们要看是否大于k,如果大于了k,我们就可以用y的代价删除这个最值,而在这之间,我们可以利用这个最值去删除其他数(不用管这个过程,我们只知道留下最值即可),所以代价消耗是x + (中间要删除的个数-k)*y。
如果都不满足这个条件,那么说明这个数最大值是删不了的,所以输出-1
2.如果y*k > x,那么我们就要尽量的用x的代价去删除数。条件;删除的数的个数大于等于k
(1)如果满足条件,那么代价为(个数/k)*x + (个数%k)*y
(2)如果不满足条件,那么没办法,我们只能用y的代价去删,那么回到1中所述,寻找最值,如果满足条件就删,不满足退出输出-1
AC代码
#include <bits/stdc++.h>
inline long long read(){char c = getchar();long long x = 0,s = 1;
while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();}
while(c >= '0' && c <= '9') {x = x*10 + c -'0';c = getchar();}
return x*s;}
using namespace std;
#define NewNode (TreeNode *)malloc(sizeof(TreeNode))
#define Mem(a,b) memset(a,b,sizeof(a))
#define lowbit(x) (x)&(-x)
const int N = 2e5 + 10;
const long long INFINF = 0x7f7f7f7f7f7f7f;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-7;
const int mod = 1e9+7;
const double II = acos(-1);
const double PP = (II*1.0)/(180.00);
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> piil;
ll arr[N],ans[N],vis[N];
ll solve(ll l,ll r)
{ll Max = 0;for(ll i = l+1;i < r;i++)Max = max(Max,arr[i]);return Max;
}//枚举最大值
signed main()
{std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);// freopen("input.txt","r",stdin);// freopen("output.txt","w",stdout);ll n,m,x,k,y,a = 2,sum = 0,flag = 0,flag1 = 0;cin >> n >> m >> x >> k >> y;for(ll i = 1;i <= n;i++) {cin >> arr[i];vis[arr[i]] = i;}//记录位置for(ll i = 1;i <= m;i++) cin >> ans[i];if(ans[1] != arr[1]) a--,ans[0] = arr[1];//这里如果ans[1] != arr[1],说明前面还删了数,还得加个端点进去if(ans[m] != arr[n]) ans[++m] = arr[n],flag1 = 1;//与上面同理for(ll i = a;i <= m;i++){ll l = vis[ans[i-1]],r = vis[ans[i]];//端点位置ll num = r-l-1;//中间要删除的个数ll Max = solve(l,r);if(i == 1) num++,Max = max(Max,arr[l]);//这里注意,如果在上面我们添加了端点进去,那么这个端点其实也是要删的,所以需要更新信息if(i == m && flag1) num++,Max = max(Max,arr[r]);//与上同理if(num < 0) {flag = 1;break;}//如果位序发生了改变,那么不可能if(y*k <= x && (Max < arr[l] || Max < arr[r]))//分情况sum += y*num;else if(y*k <= x && num >= k)sum += (x + (num-k)*y);else if(y*k > x && num >= k)sum += (num/k*x + (num%k)*y);else if(num < k && (Max < arr[l] || Max < arr[r]))sum += y*num;else{flag = 1;break;}}if(flag) cout << -1 << endl;else cout << sum << endl;
}
Educational Codeforces Round 91 (Rated for Div. 2) D.Berserk And Fireball(思维,暴力破解,分情况)相关推荐
- Educational Codeforces Round 73 (Rated for Div. 2) E. Game With String 思维博弈 好题(2500)
传送门 文章目录 题意: 思路: 题意: 思路: 我们将每一段...拿出来看成若干段,将其分成以下四种情况: (1)len<b(1)len<b(1)len<b (2)b≤len< ...
- Educational Codeforces Round 101 (Rated for Div. 2) C. Building a Fence 思维取范围
传送门 题意: 思路: 刚看到这个题其实是没什么思路,想过从前往后推或者从后往前推,但是都不是很可行.因为两边都有一个固定的挡板挡住,我们可以根据其中的一个算出来每个位置高度的范围,让后检查一下范围是 ...
- Educational Codeforces Round 96 (Rated for Div. 2) C. Numbers on Whiteboard///思维
cf地址 题目大意:给一个数n,有1~n的数,每次现在两个数a,b,将这两个数去掉,然后添加一个(a+b)/2的数(向上取整),进行n-1次操作后,问你最后剩下的数最小是多少. 思路:最小的数必定为2 ...
- Educational Codeforces Round 101 (Rated for Div. 2) D. Ceil Divisions(思维)
给出数 n ,数组 a 为 {1,2,3,--n},最多有 n+5 次机会,将任意两个不相等的数做 ceil(x/y) 运算,使得最后的数组 a 只有一个 2,其余全为 1,给出运算次数具体的运算步 ...
- Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)
Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况: a==c/ba == c / ba==c/b这个时候两 ...
- Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...
- Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...
- Educational Codeforces Round 37 (Rated for Div. 2) 1
Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 题意:Max想给花园浇水.花园可被视为长度为n的花园床,花园 ...
- Educational Codeforces Round 89 (Rated for Div. 2)(A, B, C, D)
Educational Codeforces Round 89 (Rated for Div. 2) A. Shovels and Swords 思路 题意非常简单,就是得到最多的物品嘛,我们假定a, ...
- Educational Codeforces Round 114 (Rated for Div. 2) D. The Strongest Build 暴力 + bfs
传送门 文章目录 题意: 思路: 题意: 你有nnn个装备槽,每个槽里面有cic_ici个力量加成,对于每个槽只能选一个力量加成,现在给你mmm个力量组合[b1,b2,...,bn][b_1,b_2 ...
最新文章
- 【编程好习惯】青睐小粒度锁
- BZOJ4866 Ynoi2017由乃的商场之旅(莫队)
- JVM之Java类加载器
- 团队开发博客成员介绍(发在个人博客中了)
- 利用IPFS构建自己的去中心化分布式Wiki系统
- 二分+01分数规划+最大化平均值 Dropping tests POJ - 2976
- pthread和互斥量条件变量函数意义速查表
- /dev/fb0入门练习
- chrome下载地址
- 熊猫猪新系统測试之二:Mac OS X 10.10 优胜美地
- 常量池、栈、堆的比较
- windows7 android 驱动,Windows7安卓刷机驱动安装教程图文详解
- iapp进度条倒计时_倒计时进度条app
- “私域”和“会员制”有什么区别?
- 2022珠三角深圳锂电池技术展览会暨论坛|2022华南广东深圳锂电池技术展览会
- 搭建无iDP证书的Xcode环境
- 最简单最快速csv超大文件入库并统计Top5
- c语言坐标三角形判断,C语言输入三角形边长判断其类型并输出面积实例代码
- UE4 通过蓝图实现蓝图接口
- 怎样成为公司喜欢的人?小技巧
热门文章
- springboot1.5.x+ seata1.4.2(最新版本)+springcloud ( Edgware.SR5) +eureka+feign+mybatis-plus(最新)
- 大数据处理的基本流程是什么?
- Tilera發表100核心處理器
- 费马小定理、欧拉定理总结
- 如何用计算机看苹果手机的文件,如何在电脑上管理iphone文件?
- linux twiki 添加权限,Ubuntu上TWiki安装和使用心得
- java 解析邮件_JavaMail:在Web应用下完整接收、解析复杂邮件
- Linux的自动装机服务器搭建(持续优化)
- 信息学奥赛一本通:1096:数字统计
- 第二次作业-时事点评