题目传送
题意:
现在有一个排列,再给出一个删除后的数组,删除操作只有俩种:一种是,选择连续的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(思维,暴力破解,分情况)相关推荐

  1. 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< ...

  2. Educational Codeforces Round 101 (Rated for Div. 2) C. Building a Fence 思维取范围

    传送门 题意: 思路: 刚看到这个题其实是没什么思路,想过从前往后推或者从后往前推,但是都不是很可行.因为两边都有一个固定的挡板挡住,我们可以根据其中的一个算出来每个位置高度的范围,让后检查一下范围是 ...

  3. Educational Codeforces Round 96 (Rated for Div. 2) C. Numbers on Whiteboard///思维

    cf地址 题目大意:给一个数n,有1~n的数,每次现在两个数a,b,将这两个数去掉,然后添加一个(a+b)/2的数(向上取整),进行n-1次操作后,问你最后剩下的数最小是多少. 思路:最小的数必定为2 ...

  4. 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,给出运算次数具体的运算步 ...

  5. 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这个时候两 ...

  6. Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...

  7. Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...

  8. Educational Codeforces Round 37 (Rated for Div. 2) 1

    Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 题意:Max想给花园浇水.花园可被视为长度为n的花园床,花园 ...

  9. 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, ...

  10. Educational Codeforces Round 114 (Rated for Div. 2) D. The Strongest Build 暴力 + bfs

    传送门 文章目录 题意: 思路: 题意: 你有nnn个装备槽,每个槽里面有cic_ici​个力量加成,对于每个槽只能选一个力量加成,现在给你mmm个力量组合[b1,b2,...,bn][b_1,b_2 ...

最新文章

  1. 【编程好习惯】青睐小粒度锁
  2. BZOJ4866 Ynoi2017由乃的商场之旅(莫队)
  3. JVM之Java类加载器
  4. 团队开发博客成员介绍(发在个人博客中了)
  5. 利用IPFS构建自己的去中心化分布式Wiki系统
  6. 二分+01分数规划+最大化平均值 Dropping tests POJ - 2976
  7. pthread和互斥量条件变量函数意义速查表
  8. /dev/fb0入门练习
  9. chrome下载地址
  10. 熊猫猪新系统測试之二:Mac OS X 10.10 优胜美地
  11. 常量池、栈、堆的比较
  12. windows7 android 驱动,Windows7安卓刷机驱动安装教程图文详解
  13. iapp进度条倒计时_倒计时进度条app
  14. “私域”和“会员制”有什么区别?
  15. 2022珠三角深圳锂电池技术展览会暨论坛|2022华南广东深圳锂电池技术展览会
  16. 搭建无iDP证书的Xcode环境
  17. 最简单最快速csv超大文件入库并统计Top5
  18. c语言坐标三角形判断,C语言输入三角形边长判断其类型并输出面积实例代码
  19. UE4 通过蓝图实现蓝图接口
  20. 怎样成为公司喜欢的人?小技巧

热门文章

  1. springboot1.5.x+ seata1.4.2(最新版本)+springcloud ( Edgware.SR5) +eureka+feign+mybatis-plus(最新)
  2. 大数据处理的基本流程是什么?
  3. Tilera發表100核心處理器
  4. 费马小定理、欧拉定理总结
  5. 如何用计算机看苹果手机的文件,如何在电脑上管理iphone文件?
  6. linux twiki 添加权限,Ubuntu上TWiki安装和使用心得
  7. java 解析邮件_JavaMail:在Web应用下完整接收、解析复杂邮件
  8. Linux的自动装机服务器搭建(持续优化)
  9. 信息学奥赛一本通:1096:数字统计
  10. 第二次作业-时事点评