DTOJ 3999: 游戏
题目描述
这个游戏是这样的,你有一个初始序列S ,你每次可以选择一段任意长度的连续区间,把他们+1 再膜k,给定目标序列,你需要尝试用尽量少的操作次数将初始序列变为目标序列。作为一名优秀的OIer,您认为这个游戏十分naive,所以您打算撸一个游戏脚本来取到最优解。
输入
第一行一个T 表示数据组数。
对于每组数据,第一行两个整数表示序列长度和模数。
接下来两行分别包含n 个整数,表示初始序列和目标序列。
输出
对于每组数据,输出一行一个整数表示最少操作次数。
样例输入
1
6 4
1 1 3 2 0 2
2 0 2 3 2 0
样例输出
4
提示
样例解释
四次操作的一种方式为:(1,6)(2,3)(2,3)(5,6)
数据范围
1≤T≤5
对于10% 的数据满足n≤1
对于30% 的数据满足n≤10
对于50% 的数据满足n≤100
对于70% 的数据满足n≤5000
对于100% 的数据满足1≤n≤100000,1≤k≤100,0≤x1≤n≤100000,1≤k≤100,0≤x(序列中的任一数)<k
题解:
这题有个经典模型。
给一个序列,有区间都加1和都减1操作,求变成全0的最小操作数。
这就先差分,然后正负抵消着操作即可,最后可能会剩一些正的(或负的)在加上(就是正数的和和负数的绝对值之和取max)
我们就朝着上述模型转换。
我们先考虑每个位置最少需要减多少次,设$a[i]$表示每个位置最少需要操作多少次,设$dif[i]=a[i]-a[i-1]$(就是$a[i]$的差分数组),那么在不考虑模的情况下,$ans=Σmax(dif[i],0)$。这里不考虑负的是因为操作数一定是正数,所以这一定是个正数序列,那么一定有:正数之和+负数之和>0 那么 正数之和-负数绝对值之和>0 那么 正数之和>负数绝对值之和。恩,这很显然。然而这句废话我想了半天才想出来。
不难发现$dif[i]$范围在$(-k,k)$,考虑模数带来的影响是使得一段区间的$a[i]$都$+k$,反映在$dif[i]$上就是使得$dif[l]+k$和$dif[r]-k$,所以我们要考虑,如何选取$l$和$r$使得答案更优。
比较显然的是,当$(dif[l]<0$&&$dif[r+1]>0)$选取了$l$和$r$才会使答案更优。具体做法,开一个桶用来装:如果这个位置成为$l$对答案的影响,从左到右扫一边,每次用一个桶将可以成为$l$的位置装起来如果$dif[i]<0$直接就进桶,对于可以成为$r$的位置(就是$dif[i]>0$的位置)我们每次就扫一边桶,找一下可以更新的最大值,如果找到了,就更新答案和桶。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define N 100005
using namespace std;
int T,n,k,a[N],num[N],dif[N],ans,t[105];
int main(){
scanf("%d",&T);
while(T--){
ans=0;
memset(t,0,sizeof t);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
int b;scanf("%d",&b);
if(b<a[i]) b+=k;
a[i]=b-a[i];
}
for(int i=1;i<=n;i++) dif[i]=a[i]-a[i-1];
for(int i=1;i<=n;i++) ans+=max(dif[i],0);
for(int i=1;i<=n;i++)
if(dif[i]<0) t[dif[i]+k]++;
else{
int del=0,p=0;
for(int j=1;j<=k;j++)
if(t[j]&&del<dif[i]-j) del=dif[i]-(p=j);
if(del){ans=ans-del;t[dif[i]]++;t[p]--;}//要再考虑这个i这个位置成为之后的位置的l
}
printf("%d\n",ans);
}
return 0;
}
DTOJ 3999: 游戏的更多相关文章
- [canvas]空战游戏1.18
空战游戏到今天可以玩了,玩法还是方向键(或AWSD)控制飞机位置,空格键开炮,吃五星升级,被敌机打中降级直到击落,与敌机相撞则GG. 点此下载程序1.16版,用CHrome打开index.html试玩 ...
- [Canvas]空战游戏 已经可以玩了 1.13Playable
空战游戏做到这里,己方运动,己方发射子弹,敌方运动,敌方发射子弹,子弹与飞机碰撞,飞机与飞机碰撞都已经具备了,换言之已经可以玩了. 还需要一个奖励升级系统,在上面显示击落敌机数量等,还有己方不幸被击落 ...
- [Canvas]空战游戏进阶 增加己方子弹管理类
点此下载源码,可用Chrome打开观看. 图例: 代码: <!DOCTYPE html> <html lang="utf-8"> <meta http ...
- 使用HTML5开发Kinect体感游戏
一.简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决, ...
- jQuery实践-网页版2048小游戏
▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
- Unity游戏内版本更新
最近研究了一下游戏内apk包更新的方法. ios对于应用的管理比较严格,除非热更新脚本,不太可能做到端内大版本包的更新.然而安卓端则没有此限制.因此可以做到不跳到网页或应用商店,就覆盖更新apk包. ...
- 游戏服务器菜鸟之C#初探一游戏服务
本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...
- iOS审核这些坑,腾讯游戏也踩过
作者:Jamie,专项技术测试工程师,在iOS预审和ASO优化领域从事专项测试相关工作,为腾讯游戏近100个产品提供专项服务. WeTest 导读 在App上架苹果应用商店的过程中,相信大多数iOS开 ...
- 漫谈C#编程语言在游戏领域的应用
0x00 前言 随着微软越来越开放,C#也变得越来越吸引人们的眼球.而在游戏行业中,C#也开始慢慢地获得了关注.这不, 网易绝代双娇手游团队已经全面使用.Net Core支持前后端统一C#开发,跨平台 ...
随机推荐
- Go语言核心36讲(Go语言进阶技术六)--学习笔记
12 | 使用函数的正确姿势 在前几期文章中,我们分了几次,把 Go 语言自身提供的,所有集合类的数据类型都讲了一遍,额外还讲了标准库的container包中的几个类型. 在几乎所有主流的编程语言中, ...
- 分布式表示(Distributed Representation)
NLP模型笔记 - 分布式表示 ziuno 2020-03-08 19:52:50 410 收藏 2 分类专栏: NLP 模型 笔记 文章标签: nlp 最后发布:2020-03-08 19:52:5 ...
- 转:(WIN)S04-CH01 PCIE XDMA开发环境搭建以及环路测试
摘要: 这一章开始主要介绍 XILINX FPGA PICE IP XDMA IP的使用.XDMA IP使用部分教程分LINUX 篇和WINDOWS篇两个部分.通过实战,面向应用,提供给大家 XILI ...
- spring-cloud-square源码速读(retrofit + okhttp篇)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos spring-cloud-square系列文章 五分钟 ...
- Android App隐私合规检测辅助工具(Camille)
Camille Android App隐私合规检测辅助工具,项目仓库:https://github.com/zhengjim/camille 简介 现如今APP隐私合规十分重要,各监管部门不断开展AP ...
- 大数据中必须要掌握的 Flink SQL 详细剖析
Flink SQL 是 Flink 实时计算为简化计算模型,降低用户使用实时计算门槛而设计的一套符合标准 SQL 语义的开发语言. 自 2015 年开始,阿里巴巴开始调研开源流计算引擎,最终决定基于 ...
- k8s入坑之路(15)kubernetes共享存储与StatefulSet有状态
共享存储 docker默认是无状态,当有状态服务时需要用到共享存储 为什么需要共享存储: 1.最常见有状态服务,本地存储有些程序会把文件保存在服务器目录中,如果容器重新启停则会丢失. 2.如果使用vo ...
- 热门剧本杀与 SaaS 的不解之缘
近年来,"剧本杀"这种以剧本为核心,玩家分别扮演不同角色推理案情找出真凶的娱乐项目在年轻人的范围内迅速传开,已悄然形成了一个市场规模超百亿的新兴产业,吸引了大量淘金者.而在互联网时 ...
- 01 | let 和 const语法 | es6
01 | let 和 const语法 ES6新增了let命令,用来声明变量.它的用法类似于var,但也有区别 let 和 var 1.作用范围不同 var声明的变量在全局范围内都有效,所以全局只有一个 ...
- VUE的MVVM框架解析
这篇文章主要介绍了MVVM模式中ViewModel和View.Model有什么区别?本文分别解释了它们的功能和作用,然后总结了它之间的区别,需要的朋友可以参考下 Model:很简单,就是业务逻辑相关的 ...