博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018.10.29-dtoj-3999-游戏(game)
阅读量:7064 次
发布时间:2019-06-28

本文共 1366 字,大约阅读时间需要 4 分钟。

题目描述:

这个游戏是这样的,你有一个初始序列S ,你每次可以选择一段任意长度的连续区间,把他们+1 再膜k,给定目标序列,你需要尝试用尽量少的操作次数将初始序列变为目标序列。作为一名优秀的OIer,您认为这个游戏十分naive,所以您打算撸一个游戏脚本来取到最优解。

输入:

第一行一个T 表示数据组数。

对于每组数据,第一行两个整数表示序列长度和模数。

接下来两行分别包含n 个整数,表示初始序列和目标序列。

输出:

对于每组数据,输出一行一个整数表示最少操作次数。

数据范围:

 1<=T<=5

对于10% 的数据满足n1

对于30% 的数据满足n10

对于50% 的数据满足n100

对于70% 的数据满足n5000

对于100% 的数据满足1n100000,1k100,0x1≤n≤100000,1≤k≤100,0≤x(序列中的任一数)<k

算法标签:差分&桶排

思路:

片段共同加1可以想到差分,倘若没有%k,我们可以直接差分之后每次取ans+=max(0,c[i])。加了%k之后,当我们某一段值+k时对于差分的数组的影响是头c[i]+k,尾的c[i]-k。于是我们可以用桶存c[i]+k的值然后每次取最小值不断贪心。

以下代码:

#include
#define il inline#define _(d) while(d(isdigit(ch=getchar())))using namespace std;const int N=1e5+5;int a[N],b[N],c[N],maxn,t[N],ans,k,n;il int read(){
int x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch^48;_()x=(x<<1)+(x<<3)+(ch^48);return f*x;}il int get(int x){
return abs(c[x-1]-c[x])+abs(c[x+1]-c[x]);}int main(){ int T=read();while(T--){ n=read();ans=0;k=read(); for(int i=1;i<=n;i++)a[i]=read();for(int i=1;i<=n;i++)b[i]=read(); for(int i=0;i<=k;i++)t[i]=0; for(int i=1;i<=n;i++){ if(b[i]>=a[i])c[i]=b[i]-a[i]; else c[i]=b[i]+k-a[i]; } for(int i=n;i;i--)c[i]=c[i]-c[i-1]; for(int i=1;i<=n;i++){ int tot=0; if(c[i]>0){ for(int j=1;j
View Code

 

转载于:https://www.cnblogs.com/Jessie-/p/9871127.html

你可能感兴趣的文章
文件管理相关命令
查看>>
Guava库学习:学习使用Strings和Charsets类
查看>>
学习strings、strconv包
查看>>
如何在Sharepoint Online中创建调查问卷
查看>>
Exchange 2013公网证书配置
查看>>
Java开发在线打开编辑保存Word文件
查看>>
将学习进行到底!为普通人的奋斗送福
查看>>
常用十大python机器学习库
查看>>
TCP/IP三次握手四次挥手
查看>>
Systemstate Dump分析经典案例(下)
查看>>
PHPcms怎么调用二级栏目
查看>>
中小型网络构建案例——防火墙的应用
查看>>
《Linux就该这么学》 第3章 管道符、重定向与环境变量
查看>>
Okhttp3使用
查看>>
交换的江湖
查看>>
ubuntu16.04 双网卡绑定
查看>>
lLinux学习笔记之apache及论坛的发布
查看>>
上三角
查看>>
C# 多线程学习系列二
查看>>
简单词法分析器的实现
查看>>