当前位置: 首页 > news >正文

cf935:D.Seraphim the Owl(贪心)

题目

大家排成 𝑛n 队,从 𝑖=1i=1 号开始,向猫头鹰谢拉菲姆请教生命的意义。不巧的是,基里尔正忙着为这个问题编写传说,所以他来得晚了一些,站在了 𝑛n 这个人之后,排在了队伍的最后。基里尔对这种情况完全不满意,于是他决定贿赂一些排在他前面的人。

对于队列中的 𝑖i /第三个人,基里尔知道两个值: 𝑎𝑖ai 和 𝑎𝑖ai : 𝑎𝑖ai 和 𝑏𝑖bi 。如果此刻基里尔站在 𝑖i 位置,那么他可以选择 𝑗j 这样的任意位置 𝑗<𝑖j<i ,与 𝑗j 位置的人交换位置。在这种情况下,基里尔需要支付他 𝑎𝑗aj 个金币。而对于 𝑘k 中的每一个 𝑗<𝑘<𝑖j<k<i ,基里尔都要向位置 𝑘k 的人支付 𝑏𝑘bk 个硬币。基里尔可以任意多次执行此操作。

基里尔很节俭,所以他想花尽可能少的硬币,但是他又不想等太久,所以基里尔认为他应该排在 𝑚m 人的前面。

请帮助基里尔确定,为了不等太久,他最少需要花费多少硬币。

输入

每个测试由几组输入数据组成。第一行包含一个整数 𝑡t ( 1≤𝑡≤1041≤t≤104 ) - 测试用例的数量。然后是测试用例的描述。

每个测试用例的第一行包含两个整数 𝑛n 和 𝑚m ( 1≤𝑚≤𝑛≤2000001≤m≤n≤200000 ) --分别是除基里尔之外的队列人数和基里尔最终位置的最大允许值。

第二行包含 𝑛n 个整数 𝑎1,𝑎2,…,𝑎𝑛a1,a2,…,an ,用空格分隔( 1≤𝑎𝑖≤1091≤ai≤109 )。

第三行包含 𝑛n 个整数 𝑏1,𝑏2,…,𝑏𝑛b1,b2,…,bn ,用空格隔开( 1≤𝑏𝑖≤1091≤bi≤109 )。

保证所有测试用例中 𝑛n 的值之和不超过 2⋅1052⋅105 。

输出

对于每个测试用例,输出一个整数 - Kirill 需要花费的最少金币数

做法

我们要走到前m个人以内,那么后面的人我们不管他怎么插队,反正每个人要么给他ai个金币,要么给他bi个金币,我们就选小的给就好了。然后到了前m个人的话,最终选择的位置必须给那个人ai个金币。

#include<bits/stdc++.h>
using namespace std;
int t,n,m;struct ty{long long a,b;
};long long qzh[200010];int main(){scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);vector<ty> v(n+1);for(int i=1;i<=n;i++){scanf("%lld",&v[i].a);}for(int i=1;i<=n;i++){scanf("%lld",&v[i].b);}for(int i=1;i<=n/2;i++){//倒序好处理一点swap(v[i],v[n+1-i]);}for(int i=1;i<=n;i++){qzh[i]=qzh[i-1]+min(v[i].a,v[i].b);}long long minn=0x3f3f3f3f3f3f3f3f;for(int i=n-m+1;i<=n;i++){minn=min(qzh[i-1]+v[i].a,minn);}cout<<minn<<endl;}
}

最近在学dp嘛,感觉能用dp写,但复杂度降不下去,加上题目那的标记也说是动规,我还以为是哪里可以降低复杂度,没想到是贪心了。dp的话就要考虑是从哪个位置插队上来的最小,但其实根本就不用这么复杂。

#include<bits/stdc++.h>
using namespace std;
int t,n,m;
long long dp[200010];//考虑了前i个位置,最小金币为 
struct ty{long long a,b;
};
long long qzh[200010];
int main(){scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);vector<ty> v(n+1);for(int i=1;i<=n;i++){scanf("%lld",&v[i].a);}for(int i=1;i<=n;i++){scanf("%lld",&v[i].b);}for(int i=1;i<=n/2;i++){swap(v[i],v[n+1-i]);}for(int i=1;i<=n;i++){qzh[i]=qzh[i-1]+v[i].b;}memset(dp,0x3f3f3f3f3f3f3f3f,sizeof(dp));dp[0]=0;for(int i=1;i<=n;i++){for(int j=0;j<i;j++){dp[i]=min(dp[i],dp[j]+v[i].a+qzh[i-1]-qzh[j]);}}long long minn=0x3f3f3f3f3f3f3f3f;for(int i=n-m+1;i<=n;i++) minn=min(dp[i],minn);cout<<minn<<endl;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • c++入门基础(下篇)————引用、inline、nullptr
  • 爬虫:xpath模块及昵图网实例
  • 宏编程:C++宏、Rust宏和Lisp宏比较
  • [GWCTF 2019]我有一个数据库1
  • 24年电赛——自动行驶小车(H题)MSPM0G3507-编码电机驱动与通用PID
  • unity 小怪播放动画导致ui抖动
  • C-V2X通信协议
  • 正点原子imx6ull-mini-Linux驱动之Linux LCD 驱动实验(19)
  • 【数据泄露】最新 FBI 官员数据库泄露事件
  • createObjectURL的部分使用讲解
  • 锅总浅析防火墙
  • 三线程分别打印1、2、3顺序执行10次
  • 游戏加速器推荐 网游加速器排行榜
  • 快速将网站从HTTP升级为HTTPS
  • Git代码冲突怎么处理?
  • [译] 怎样写一个基础的编译器
  • 【comparator, comparable】小总结
  • 【前端学习】-粗谈选择器
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • JavaScript DOM 10 - 滚动
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • js中forEach回调同异步问题
  • Laravel 中的一个后期静态绑定
  • Mithril.js 入门介绍
  • Python爬虫--- 1.3 BS4库的解析器
  • RxJS: 简单入门
  • Web设计流程优化:网页效果图设计新思路
  • 关于 Cirru Editor 存储格式
  • 前端
  • 如何利用MongoDB打造TOP榜小程序
  • 微信开源mars源码分析1—上层samples分析
  • HanLP分词命名实体提取详解
  • PostgreSQL之连接数修改
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​浅谈 Linux 中的 core dump 分析方法
  • #Linux(make工具和makefile文件以及makefile语法)
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (4)(4.6) Triducer
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (剑指Offer)面试题34:丑数
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (四)鸿鹄云架构一服务注册中心
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Core 项目指定SDK版本
  • .Net 中Partitioner static与dynamic的性能对比
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET开源项目介绍及资源推荐:数据持久层
  • @Autowired 与@Resource的区别