Business Cycle 【UVALive - 7501】【二分答案+思维处理】

2023-11-05

题目链接


  14年的EC(银牌题),但是现在的大牛们进步神速,估计如今已经是道铜牌题了,具体我们先讲一下题意。

  一个长度为N的自环圈,每个点(1~N)上有自己对应的权值(可能为负数),我们用一个初始值进入这个环,每次走到一个节点的时候会加上这个节点的权值,如果此时的权值<0,就为0了,问P步之内是否存在一点使得权值>=G。问这样的投入值的最小值。

  思路

  既然我们要求的是这样的答案最小值,我们不妨可以二分答案试试,我们枚举这样的答案,放进这个环里去,要是出现了权值>G的就直接返回true就是了,然后,怎么去处理P可能为1e18这么大的一个值?我们得去寻它的周期,既然是环,就有自己的周期,可能为负,可能为0,也可能为正,这就是我们需要判断的东西了。

  一个周期下来,我们可能没发比较,因为举个例子{ N=3; a[] = {-50, -90, 100}; }这样的环,一个周期下来,上升了100!可是这不是真实值,当下个周期来临的时候,会发现对应100的那个点还是100,其余点还是0,那岂不是没有改变!所以,周期不应当如此来算,我们得跑两个环来算周期差

  算出周期的差值之后,会发现周期差值会“<=0”或者“>0”,前者的话,跑两圈之后,与跑两圈以内就没有任何差别了,所以都不需要再去判断了;后者,那么如果我们的步数P足够大的话,可以跑完两圈再继续跑的话,我们就可以以第二圈为基础,往后继续跑相应的路程了,但是后者就又要相关的处理了,我们跑到最后几圈的时候就得开始慎重了,当最后一个完整圈的时候,我们得先去这个完整圈子里看看有没有符合条件的最大值,然后再去看下剩余的不足一个完整圈的那几步中的最大值,于是只需要判断最大值是否大于等于G即可了。

  大纲

  1. 先跑两个周期,找周期差值;
  2. 判断周期差值的范围「<=0 or >0」以及P与N的关系,是否是两圈之内就可以走完;
  3. 如果周期差值>0以及p>=2*N,就说明,可以走两圈以上,并且最大值可能会出现在后面的节点上,于是就要跑最后一个完整周期以及跑完完整周期后的剩余几步中找寻最大值。

  具体的步骤就这么多,但是处理的方式可就考验思维了,一开始写了一大长串,还WA、T,然后就决定把它们放进两个函数里去处理,一下子方便了很多(虽然时间复杂度高了)。


#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 1e5 + 7;
ll N, G, P, a[maxN] = {0}, b[maxN] = {0};
ll lound(ll key)
{
    ll pre = key;
    for(int i=1; i<=N; i++)
    {
        pre += a[i];
        if(pre < 0) pre = 0;
    }
    return pre;
}
ll lound_Maxx(ll pos, ll key)
{
    ll pre = key, ans = key;
    for(int i=1; i<=pos; i++)
    {
        pre += a[i];
        if(pre < 0) pre = 0;
        ans = max(ans, pre);
    }
    return ans;
}
bool solve(ll num)
{
    ll ans = num;
    ll lound_1 = lound(num);
    ll lound_2 = lound(lound_1);
    if(lound_1 >= lound_2 || P < 2*N)
    {
        if(P > N)
        {
            if(P < 2*N) ans = max(ans, lound_Maxx(P - N, lound_1));
            else ans = max(ans, lound_Maxx(N, lound_1));
        }
        else ans = max(ans, lound_Maxx(P, num));
        return ans >= G;
    }
    ll tims = P/N, rest = P%N, sum_of = lound_2 - lound_1;
    if((tims - 1) > (G - lound_1)/sum_of) return true;
    ll ans_1 = 0, ans_2 = 0;
    if(tims > 1) ans_1 = (tims - 1)*(lound_2 - lound_1) + lound_1;
    else ans_1 = lound_1;
    ans_1 = lound_Maxx(rest, ans_1);
    if(tims > 2) ans_2 = (tims - 2)*(lound_2 - lound_1) + lound_1;
    else ans_2 = lound_1;
    ans_2 = lound_Maxx(N, ans_2);
    ans = max(ans, max(ans_1, ans_2));
    return ans >= G;
}
int main()
{
    int T;  scanf("%d", &T);
    for(int Cas=1; Cas<=T; Cas++)
    {
        scanf("%lld%lld%lld", &N, &G, &P);
        for(int i=1; i<=N; i++) scanf("%lld", &a[i]);
        ll L = 0, R = G, mid = 0, ans = G;
        while(L <= R)
        {
            mid = (L + R)>>1;
            if(solve(mid))
            {
                R = mid - 1;
                ans = mid;
            }
            else L = mid + 1;
        }
        printf("Case #%d: %lld\n", Cas, ans);
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Business Cycle 【UVALive - 7501】【二分答案+思维处理】 的相关文章

  • [二分答案] 洛谷P1873 砍树

    目录 题意样例样例输入 xff1a 样例输出 思路总结代码 题意 伐木工人米尔科需要砍倒M米长的木材 这是一个对米尔科来说很容易的工作 xff0c 因为他有一个漂亮的新伐木机 xff0c 可以像野火一样砍倒森林 不过 xff0c 米尔科只被
  • AcWing 756. 蛇形矩阵

    题目 输入两个整数n和m 输出一个n行m列的矩阵 将数字 1 到 n m 按照回字蛇形填充至矩阵中 具体矩阵形式可参考样例 输入格式 输入共一行 包含两个整数n和m 输出格式 输出满足要求的矩阵 矩阵占n行 每行包含m个空格隔开的整数 数据
  • 力扣(LeetCode)795. 区间子数组个数(C++)

    模拟 有一种构想 只考虑上边界 在小边界和大边界之间的连续子数组个数 小于等于大边界的连续子数组个数 小于小边界的连续子数组个数 连续子数组个数计算公式
  • Prefix Flip【小模拟】

    题目链接CF 1382 C2 题意 有两个字符串 现在我们要让第一个字符串变成第二个字符串 只允许使用2N次操作 问操作 每次操作是选前缀x个 然后首先前缀x全体异或1 然后字符串翻转 于是 很明显的 我们可以按次数每次维护最后一个字符串
  • 第十三届蓝桥杯 ——刷题统计

    题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛 他计划周一至周五每天做 a a a 道题目 周六和周日每天做 b b b 道题目 请你帮小明计算 按照计划他将在第几天实现做题数大于等于
  • Basic Level 1053 住房空置率 (20分)

    题目 在不打扰居民的前提下 统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断 判断方法如下 在观察期内 若存在超过一半的日子用电量低于某给定的阈值 e 则该住房为 可能空置 若观察期超过某给定阈值 D 天 且满足上一个条件 则
  • Basic Level 1010 一元多项式求导 (25分)

    题目 设计函数求一元多项式的导数 注 x n x n xn n为整数 的一阶导数为 n x n
  • J - Good Coins

    虽然很简单 但还是记录一下 或许能给以后的题一点思路 include
  • Happiness【2019EC Final G题】【模拟】

    题目链接 题意很长 先翻译一下 由N个参赛队伍 给出其余N 1只参赛队伍 另外一支队伍是我们 本次ICPC一共有10道题 我们知道其余N支队伍每道题的通过时间和错误次数 如果是 则为没有在300分钟内解决该问题 最后给出我们队伍 做出每道题
  • H - Give Me This Pizza(栈stack)

    H Give Me This Pizzahttps vjudge csgrandeur cn problem Gym 101343H include
  • Business Cycle 【UVALive - 7501】【二分答案+思维处理】

    题目链接 14年的EC 银牌题 但是现在的大牛们进步神速 估计如今已经是道铜牌题了 具体我们先讲一下题意 一个长度为N的自环圈 每个点 1 N 上有自己对应的权值 可能为负数 我们用一个初始值进入这个环 每次走到一个节点的时候会加上这个节点
  • AcWing 422. 校门外的树

    题目 某校大门外长度为L的马路上有一排树 每两棵相邻的树之间的间隔都是1米 我们可以把马路看成一个数轴 马路的一端在数轴0的位置 另一端在L的位置 数轴上的每个整数点 即0 1 2 L 都种有一棵树 由于马路上有一些区域要用来建地铁 这些区
  • Salary Changing【Codeforces 1251 D】【二分答案】

    Educational Codeforces Round 75 Rated for Div 2 D 题意 有N名员工和S元钱 然后我们想知道在每一名员工有薪资要求在 li ri 的情况下 我们如何在总共就S元钱的情况下做到员工薪资的中位数最
  • F - Ginger的GIAO

    F Ginger的GIAO SDUT OnlineJudge include
  • B. Permutation

    Problem B Codeforces include
  • A. Doremy‘s IQ(贪心)

    Problem A Codeforces 题意 一个人的IQ为q 有n场比赛 第i天只能参加第i场比赛 如果比赛难度大于IQ 那么IQ就会下降 如果IQ为0就不能参加比赛了 问最多能参加多少场比赛 输入一个01串 0表示不参加 1表示参加
  • [leetcode] 球会落何处 模拟

    给出一个矩阵 里面的值为 1 or 1 1的时候是从左上到右下 1的时候是从左下到右上 当一个球从上方x 0 lt x lt m 放入之后 从哪个出口掉落还是无法从出口掉落 能通过的情况为 即某条线为 其左边的线也是 箭头所指为当前斜线 即
  • Acwing-3443. 学分绩点

    include
  • 2022年天梯赛-全国总决赛 L2-1 插松枝 (25 分)

    又来补题了哎哎哎 考试的时候卡了一小时就离谱 include
  • Match Points【Codeforces 1156C】【二分答案】

    题目链接 题意有点像上海EC某年的一道铜牌题 具体是哪年记不得了 我们要去N个的关系 使得最多的匹配对达到他们的差值 Z 这样的情况 有这样的一组数据可以很好的反映这道题为什么有人会WA了 4 3 1 4 5 7 但是 同时也证明了 我们取

随机推荐

  • VC++6.0 没用atlstr.h 怎么办

    在VC 6 0中配置WTL9 0 提示没有atlstr h 这个文件 怎么办呢 于是把atlmisc h这个文件 复制一份 把名称改成atlstr h 不就OK了 又可使用CString 这个恶心的东西了 编绎一下试试 提示 error C
  • CSS选择器器练习之餐厅小游戏答案和解析(下)

    17 small last child 伪类选择器 last child选择最后一个子元素 18 plate nth child 3 伪类选择器 nth child 选择第n个子元素 19 bento nth last child 3 伪类
  • linux命令行将已有项目提交到github

    用git是在windows下用git的图形化界面进行操作的 这次有一个写了几天的小项目想提交到git上 linux命令行下面没有图形化的界面 所以全部需要git命令来操作 实践之后 主要是下面几个步骤 1 登陆github 创建一个repo
  • Layui之选项卡案例 详细易懂

    本期精彩 利用Layui框架实现动态选项卡 继上一篇已经实现了左边的树形菜单栏 这一关卡我们已通过 接下来就是实现右边的动态选项卡的关卡 上个关卡的效果及链接 链接 http t csdn cn tYccL 目录 本期精彩 利用Layui框
  • Android JNI开发从0到1,java调C,C调Java,保姆级教程详解

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 第一步首先配置Android studio的NDK开发环境 首先在Android studio中下载NDK
  • 3.5.1 ASM规划及实现

    最后更新2021 08 14 AMS规划 规划涉及到几个参数 它们之间互相影响 如果需要修改其中一个 注意是否需要同时修改其它几个 下面是几个重要参数及其概念 Memory Pool size共享内存池的大小 使用同一共享内存池的分区数量
  • 贷后联动管控指标与差异化案件的分配逻辑

    在风控精细化运营的当下 贷后工作的开展 越来越需要精细化管理 如何做好相关的精细化管理工作 首先我们从这些贷后相关的名词如下开始熟悉 贷后基本催收名词解释 Flow Rate 迁移率就是在贷后资产评估里最重要的报表了 比如计算M0到M1的迁
  • shell脚本获取当前ip地址

    需求 shell脚本里我需要根据不同的ip地址做出不同的操作 因此我需要在shell脚本里获取当前主机的ip地址 我需要获取到192 168 1 111这个ip地址 方法1 ifconfig grep inet 地址 grep 192 16
  • (十五)视频处理、不用事先训练

    十五 视频处理 不用事先训练 本文的代码的功能是 可以对人物视频进行操作 不用预先耗时训练模型 效率极高 可进行视频处理 使用了人工智能的算法 注 请移步最新博文 十八 一 主要功能 以下的Python代码的功能 选择视频 主要包括 1 对
  • 图解数据结构与算法-搜索与回溯

    前言 本博客是leetcode上图解算法数据结构 LeetBook 力扣 LeetCode 全球极客挚爱的技术成长平台的刷题记录 可能存在错误 仅供参考 主要记录刷题过程的思路 错误 代码以及总结 更详细的解答可以直接看上面这本书 如发现错
  • 最小生成树之克鲁斯卡尔算法

    目录 前言 一 克鲁斯卡尔算法构造过程 二 算法实现 1 辅助结构体 数组 2 算法核心 3 排序函数 总结 前言 承接上文普里姆算法 这里的克鲁斯卡尔算法是解决最短联通路径的另一种算法 细节就不多概述了 思想都是一样的 知识解决问题的出发
  • 大数和代码实现(不使用BigInteger)

    代码实现如下 import java util Scanner public class BigSum public static void main String args String num1 getNumber String num
  • openwrt frpc问题

    1 frpc ssh多个进程可能失败 只保留一个进程就ok 2 自启动方法init d可能无效 openwrt system scheduled tasks 1 etc init d frpc start 2 gt dev null
  • 某市出租车,起步价(2 公里以内)为 8 元,超过 2 公里的按照每公里 4.5 元计算。要求根据路程计算费用。

    public class Task 10101003 01 public static void main String args Scanner input new Scanner System in double sum 0 总费用 d
  • C++,引用和指针

    引用指的是对什么的引用 是地址引用吗 这不和指针一样吗 引用 Reference 是C 中一种特殊的变量类型 它可以被看作是对另一个变量的别名 即某个变量的引用 引用不是地址引用 它是在语法层面提供的一种更直观 更安全的方式来访问和修改其他
  • echarts折现图的点击事件===非常简单哦,直接在后面加事件

    先看效果图吧 一般我们echars的折现图设置点击事件时 只能点击那个点 特别的不方便 在这里我们在用一种方法让他可以划过点击 可以打印看下得到的数据 myChart setOption option true myChart getZr
  • R语言之基础数据管理(下)

    1 类型转换 R语言中数据类型判断及转换函数 判 断 转换 is numeric as numeric is character as character is vector as vector is matrix as matrix is
  • 【科普贴】LDO电源详解

    一 LDO结构和工作原理 LDO 全称是 Low Dropout Regulator 低压差线性稳压器 其中核心部件是工作在线性区域的调整管 如下图中的VT MOS管 LDO由VT 放大器 反馈电阻等部分组成 如上图所示 通过R1和R2电阻
  • 免费App开发解决方案 一键生成App

    Mob App工厂 顾名思义指生产App的一个工厂 这个工厂目前能生产四种类型的App模板 新闻类App 商城类App 社交类App WordPress 可大量生产不同种类App 满足多种行业需求 Mob App 工厂依托于Mob开发者平台
  • Business Cycle 【UVALive - 7501】【二分答案+思维处理】

    题目链接 14年的EC 银牌题 但是现在的大牛们进步神速 估计如今已经是道铜牌题了 具体我们先讲一下题意 一个长度为N的自环圈 每个点 1 N 上有自己对应的权值 可能为负数 我们用一个初始值进入这个环 每次走到一个节点的时候会加上这个节点