老虎ji 剪枝模拟
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
每组数据第一行包含两个正整数n,k(1≤n≤100000,1≤k≤1018),表示序列长度以及你初始的游戏币数量。
第二行包含n个整数a[0],a[1],…,a[n−1](−109≤a[i]≤109)。
输入数据保证所有数据中n的总和不超过1000000。
Output
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 剪枝模拟的更多相关文章
- USACO 1.3... 虫洞 解题报告(搜索+强大剪枝+模拟)
这题可真是又让我找到了八数码的感觉...哈哈. 首先,第一次见题,没有思路,第二次看题,感觉是搜索,就这样写下来了. 这题我几乎是一个点一个点改对的(至于为什么是这样,后面给你看一个神奇的东西),让我 ...
- 【P1274】魔术数字游戏(搜索+剪枝+模拟)
做完了这个题的我一口老血喷在屏幕上... 这个题难度不高(~~胡扯~~),就是爆搜就可以了,然而..判断条件灰常多,剪枝也就非常多..然而,这些判断条件又不得不必须满足,所以也就十分容易错... 说一 ...
- USACO Chapter 1 解题总结
USACO Chapter 1 解题总结 1.1.1 Your Ride Is Here 基本字符串操作,无压力. 1.1.2 Greedy Gift Givers 基础模拟题,弄明白题意,不怕麻烦, ...
- R语言-laohuji
项目三-tiger机 说明:每玩一次老ji游戏需要花费一元钱.钻石符号(DD)可以百搭,并且能够将最终的金额加倍. 任务分解: 任务分解的步骤: 将复杂的任务分解为一些简单的子任务: 使用实例: 用通 ...
- [C#] 汉字转拼音,支持多音字
这份代码大概不是严格意义上正确的,但是一般场景用用应该没问题. using System; using System.Collections.Generic; using System.Linq; u ...
- [CSP-S模拟测试]:D(暴力+剪枝)
题目传送门(内部题47) 输入格式 第一行一个正整数$n$.第二行$n$个正整数,表示序列$A_i$. 输出格式 一行一个正整数,表示答案. 样例 样例输入: 530 60 20 20 20 样例输出 ...
- [CSP-S模拟测试]:Reverse(模拟+暴力+剪枝)
题目描述 小$G$有一个长度为$n$的$01$串$T$,其中只有$T_S=1$,其余位置都是$0$.现在小$G$可以进行若干次以下操作: $\bullet$选择一个长度为K的连续子串($K$是给定的常 ...
- Noip2011 Mayan游戏 搜索 + 模拟 + 剪枝
写了一下午,终于AC了. 由于n<=5, 所以不需要太多的剪枝和技巧也能过.可以将操作后的消方块和下落和剪枝函数写到一个结构体中,这样会减少调试难度,更加简洁. 可以采用如下剪枝: 1. 如果当 ...
- NOIP 模拟 玩积木 - 迭代加深搜索 / bfs+hash+玄学剪枝
题目大意: 有一堆积木,0号节点每次可以和其上方,下方,左上,右下的其中一个交换,问至少需要多少次达到目标状态,若步数超过20,输出too difficult 目标状态: 0 1 1 2 2 2 3 ...
随机推荐
- Mysql41道练习题
1.自行创建测试数据 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号.ps:针对的是自己的生物成绩比物理成绩高,再把符合条件的学生的学号查出来: # 查到 生物 和 物理的 id: sele ...
- 11)django-ORM(操作增删改查)
ORM从增删改查等方面说明 一:创建数据 #创建数据两种方式1,推荐方式1 UserInfo.objects.create(username=") #方式1变种 user_dict={&qu ...
- poj1562 Oil Deposits 深搜模板题
题目描述: Description The GeoSurvComp geologic survey company is responsible for detecting underground o ...
- C# Winform控件对透明图片重叠时导致图片不透明的解决方法(转)
在Winform中如果将一个透明图片放在窗体上能正常显示透明,但是如果将该图片放在另一个控件上会导致不能显示透明效果. 解决这种情况,可以采取在控件上使用GDI+绘画出透明图片. 这里我们就以一个pi ...
- robot启动
可以这句写入到bat文件里 pythonw.exe -c "from robotide import main; main()"
- jenkins自动发布java代码
注:本文来源于<KaliArch> jenkins笔记 一.相关概念 1.1 Jenkins概念: Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台. ...
- Confluence 6 数据中心的 SAML 单点登录最佳实践和故障排除
最佳实践 SAML 授权仅仅在有限的时间进行校验.你需要确定运行你的应用的计算机时间与 IdP 的时间是同步的. 如果你应用中的用户和用户组是通过用户目录进行配置的,你通常希望用户来源目录和你的 Id ...
- 将Maven项目打包成可执行jar文件(引用第三方jar)
方法一. mvn assembly 或 mvn package (一个jar包) 把依赖包和自己项目的文件打包如同一个jar包(这种方式对spring的项目不支持) <build> ...
- 【sqli-labs】Less11~Less16
学习sqli-labs的笔记,前面的笔记内容比较详细.后面的只记录关键点了. Less11: POST注入, 有回显,有错误提示 从11题起是POST注入,发现有两个输入框.用firefox的F12查 ...
- poj1155 依赖背包
/* 依赖背包 dp[i][j]表示i结点为根的树选择j个用户时的最大剩余费用 即背包容量是j,价值是最大费用 */ #include<iostream> #include<cstr ...