Problem Description

“在赌场里,基本原则就是让他们玩下去以及让他们再来玩。他们玩得越久,他们会输的越多,最后,我们会得到一切。”
(摘自1995年的电影Casino)

你正在一家赌场的老虎ji面前,你的手上共有k个游戏币。

当你每次按下老虎ji的按钮时,它会随机地报出一个数字d,如果d=0,那么什么事情都不会发生;如果d>0,那么恭喜你,老虎ji会吐给你d个游戏币;但是如果d<0,很不幸,你将需要支付给老虎ji d个游戏币。

这台老虎ji的工作原理很简单,在老虎ji内部有一个长度为n的序列a[0],a[1],…,a[n−1],每当你按下按钮时,如果你手上共有k个游戏币,那么它报出的数字d就是a[kmodn]。

前几次赌博让你尝到了甜头,贪婪的欲望驱动着你不停地按下老虎ji的按钮。当d<0且你支付不了那么多游戏币时,你宣告破产。请问在你破产的时候你一共按过多少次按钮呢?

Input

第一行包含一个正整数T(1≤T≤5000),表示测试数据的组数。

每组数据第一行包含两个正整数n,k(1≤n≤100000,1≤k≤1018),表示序列长度以及你初始的游戏币数量。

第二行包含n个整数a[0],a[1],…,a[n−1](−109≤a[i]≤109)。

输入数据保证所有数据中n的总和不超过1000000。

Output

对于每组数据输出一行一个整数,即你破产的时候你一共按过按钮的次数。如果你运气很好,永远都不会破产,请输出−1。

Sample Input

1
5 20
-1 -2 3 4 -5

Sample Output

5

显然最普通的模拟方法肯定会超时 

用另一种模拟方法 时间复杂度n
模拟第一轮 直到遇到循环 也就是第二次走到某个地方 然后就可以求出 一遍循环走的步数c 和一遍循环减小的数值d
显然 如果d<=0那么就是死循环 输出-1即可 一开始:
当前k除 n*d 到k为负数
但是错误性很明显:不可能每次都是循环结束才-k 很可能在循环的中间就已经减到负数了 所以cnt会偏大 调整:
预留一次循环:就是把k变为k%d(之前的想法是把k变成负数) 预留最后一次循环自己模拟 正确性也很明显 但是还有个bug
可能每次循环的差值d很小 但是在循环过程中 起伏非常大 在倒数第二遍或者。。。就已经被减为负数了 所以再调整:
求出d的最大连续和(我这里求的是极限数值) 让k比d大的时候开始最原始模拟
#include<bits/stdc++.h>
using namespace std;
//input
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);i--)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m);
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define inf 0x3f3f3f3f
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define N 100000+10
ll a[N];
ll vis[N][];
int main()
{
int cas;RI(cas);
while(cas--)
{
int n;
ll k;
RI(n);cin>>k;
rep(i,,n-)
scanf("%lld",&a[i]),vis[i][]=,vis[i][]=;
ll cnt=;
ll maxx=inf;
ll temp=;
while()
{
ll pos=k%n;
if(a[pos]<)//找出中间过程中的最小值之和 这样找并不是精确值 但比最小值要更小 (不精确导致时间花费的更多一点)
temp+=a[pos];
maxx=min( maxx,min(temp,a[pos]) );
k+=a[pos];
cnt++;
if(k<){printf("%lld\n",cnt);break;} if(!vis[pos][])
{
vis[pos][]=cnt;
vis[pos][]=k;
}
else
{
ll d=vis[pos][]-k;
ll c=cnt-vis[pos][];
if(d<=){printf("-1\n");break;} maxx=-maxx;
ll h=k/d;
cnt+=h*c;
k%=d;
while(k<=maxx)//回补
{
k+=d;
cnt-=c;
}
while()
{
ll x=k%n;
k+=a[x];
cnt++;
if(k<){printf("%lld\n",cnt);break;}
}
break;
}
}
}
}

老虎ji 剪枝模拟的更多相关文章

  1. USACO 1.3... 虫洞 解题报告(搜索+强大剪枝+模拟)

    这题可真是又让我找到了八数码的感觉...哈哈. 首先,第一次见题,没有思路,第二次看题,感觉是搜索,就这样写下来了. 这题我几乎是一个点一个点改对的(至于为什么是这样,后面给你看一个神奇的东西),让我 ...

  2. 【P1274】魔术数字游戏(搜索+剪枝+模拟)

    做完了这个题的我一口老血喷在屏幕上... 这个题难度不高(~~胡扯~~),就是爆搜就可以了,然而..判断条件灰常多,剪枝也就非常多..然而,这些判断条件又不得不必须满足,所以也就十分容易错... 说一 ...

  3. USACO Chapter 1 解题总结

    USACO Chapter 1 解题总结 1.1.1 Your Ride Is Here 基本字符串操作,无压力. 1.1.2 Greedy Gift Givers 基础模拟题,弄明白题意,不怕麻烦, ...

  4. R语言-laohuji

    项目三-tiger机 说明:每玩一次老ji游戏需要花费一元钱.钻石符号(DD)可以百搭,并且能够将最终的金额加倍. 任务分解: 任务分解的步骤: 将复杂的任务分解为一些简单的子任务: 使用实例: 用通 ...

  5. [C#] 汉字转拼音,支持多音字

    这份代码大概不是严格意义上正确的,但是一般场景用用应该没问题. using System; using System.Collections.Generic; using System.Linq; u ...

  6. [CSP-S模拟测试]:D(暴力+剪枝)

    题目传送门(内部题47) 输入格式 第一行一个正整数$n$.第二行$n$个正整数,表示序列$A_i$. 输出格式 一行一个正整数,表示答案. 样例 样例输入: 530 60 20 20 20 样例输出 ...

  7. [CSP-S模拟测试]:Reverse(模拟+暴力+剪枝)

    题目描述 小$G$有一个长度为$n$的$01$串$T$,其中只有$T_S=1$,其余位置都是$0$.现在小$G$可以进行若干次以下操作: $\bullet$选择一个长度为K的连续子串($K$是给定的常 ...

  8. Noip2011 Mayan游戏 搜索 + 模拟 + 剪枝

    写了一下午,终于AC了. 由于n<=5, 所以不需要太多的剪枝和技巧也能过.可以将操作后的消方块和下落和剪枝函数写到一个结构体中,这样会减少调试难度,更加简洁. 可以采用如下剪枝: 1. 如果当 ...

  9. NOIP 模拟 玩积木 - 迭代加深搜索 / bfs+hash+玄学剪枝

    题目大意: 有一堆积木,0号节点每次可以和其上方,下方,左上,右下的其中一个交换,问至少需要多少次达到目标状态,若步数超过20,输出too difficult 目标状态: 0 1 1 2 2 2 3 ...

随机推荐

  1. 查看当前APP打开的是哪个Activity

    按下 “window键+R键” 打开电脑的 “运行” 窗口,输入“cmd”,进入你的adb.exe所在的目录,输入 “ adb shell "dumpsys window | grep mC ...

  2. Jmeter之csv参数化

    创建数据源csv文件 在线程组中添加CSV Data Set Config 1.添加CSV Data Set Config 添加CSV Data Set Config 2.配置CSV Data Set ...

  3. JS访问SpringMVC后台

    var actions=ctx.path + "/api/stat/exportScheStatInfo.json"; var form = $("<form> ...

  4. 瑞联科技:Pwp3框架 调用存储过程返还数据集合 到前端界面展示

    一:代码结构: 1:Js 代码结构 2:Java 代码结构 二:前端界面展示效果 为了数据安全性:界面数据做了处理 三:全端代码展示 1:main.vop <html> <head& ...

  5. 参数FAST_START_MTTR_TARGET的理解

    本文来源:keeptrying  <参数FAST_START_MTTR_TARGET的理解> 参数FAST_START_MTTR_TARGET的理解 一.FAST_START_MTTR_T ...

  6. Confluence 6 管理协同编辑

    协同编辑能够让项目小组中的协同合作达到下一个高度.这个页面对相关协同编辑中的问题进行了讨论,能够提供给你所有希望了解的内容. 进入 Collaborative editing 页面来获得项目小组是如何 ...

  7. Java测试的题目感想

    日期:2018.9.24 星期一 博客期:012 说起来测试真的是来的时候信心满满,考完的时候慌得出神!我感觉自己会用Scanner类做输出和文件操作就可以在有限时间内把它搞出来了!事实证明我错了!我 ...

  8. ionic3 点击input 弹出白色遮罩 遮挡上部内容

    在Manifest中的activity里设置android:windowSoftInputMode为adjustPan,默认为adjustResize,当前窗口的内容将自动移动以便当前焦点从不被键盘覆 ...

  9. kindedit编辑器和xxs攻击防护(BeautifulSoup)的简单使用

    一.kindedit编辑器 就是上面这样的编辑输入文本的一个编辑器 这也是一个插件.那么怎么用呢? 1.下载:百度kindedit 2.引入: <script src="/static ...

  10. DSB

    Linux day01 计算机硬件知识整理 作业要求:整理博客,内容如下 编程语言的作用及与操作系统和硬件的关系 应用程序->操作系统->硬件 cpu->内存->磁盘 cpu与 ...