首页 > 其他分享 >【题解】Luogu[P6003] USACO20JAN Loan Repayment S

【题解】Luogu[P6003] USACO20JAN Loan Repayment S

时间:2023-05-13 22:34:21浏览次数:36  
标签:lfloor int 题解 Loan rfloor 合法 USACO20JAN dfrac 复杂度

模拟赛第一题(

9pts

考虑暴力。

枚举 \(x\),对于每个 \(x\),模拟 \(k\) 天,判断其是否合法,找出最大的 \(x\)。

时间复杂度:\(O(n^2)\)

36pts

考虑优化先前暴力算法。

我们不难发现当 \(x\) 合法时,必然有合法 \(x_1\),当且仅当 \(x_1 < x\)。
故 \(x\) 具有单调性,考虑二分答案。

对于 \(x\),我们进行二分答案,对于每一个 \(x\),我们对其进行判断是否合法。
其中判断合法我们每一天逐一枚举,时间复杂度 \(O(k)\)。若合法,我们便再去寻找更大的合法 \(x\)。

时间复杂度:\(O(n \log n)\)

bool check(int x) {
    int num = 0;
    for (int i = 1; i <= k; i++) {
        int y = (n - num) / x;
        if (y < m) y = m;
        num += y;
    }
    if (num >= n) return true;
    return false;
}

signed main() {
    n = read(), k = read(), m = read();
    int l = 1, r = n;
    while (l <= r) {
        int mid = (l + r) / 2;
        if (check(mid)) ans = mid, l = mid + 1;
        else r = mid - 1;
    }
    printf("%d\n", ans);
    return 0;
}

100pts

我们发现先前算法中,check() 函数效率为 \(O(k)\),是显然超时的,我们考虑优化 check()

对于每个 \(y\),我们发现,当其中的 \(x\) 固定时,存在 \(z\) 使得 \(y = \lfloor \dfrac{z}{x} \rfloor = \lfloor \dfrac{z + 1}{x} \rfloor = \dots = \lfloor \dfrac{z + a}{x} \rfloor\)

故我们可以算出其中的 \(a\),一次将 \(a\) 个相同的 \(y\) 算出。

我们假设当前欠了 \(r\) 加仑,还有 \(t\) 天的时间去还。
那么我们对于 \(r\),每次算出 \(a\),判断其是否能在 \(k\) 天中还完。
我们知道若存在 \(a\),则 \(\lfloor \dfrac{z + (a - 1)}{x} \rfloor\) 依然等于 \(\lfloor \dfrac{z + a}{x} \rfloor\),而 \(a\) 天之后必然有 \(\lfloor \dfrac{z + a}{x} \rfloor \le \lfloor \dfrac{z + a - 1}{x} \rfloor\)。
通过计算得出 \(a = \lfloor \dfrac{r}{y} - x + 1 \rfloor\)
因为均为 int,故对于正整数 \(a\) 直接 \(a = \dfrac{r}{y} - x + 1\)

当此时 \(y <= m\) 时,因为题面说明 \(y = m\),故可以直接算出剩余天数能还的量。

容易看出,当 \(r \le 0\) 或者 \(t == 0\) 时,就不需要进行计算。
当 \(t == 0\) 时,若 \(r \le 0\),说明对于当前 \(x\),能在规定时间内还完,故合法。

时间复杂度:\(O(\sqrt{n} \log n)\)

#define int long long
int n, k, m, ans;

bool check(int x) {
    int r = n, t = k;
    while (r > 0 && t) {
        int y = r / x;
        if (y <= m) r -= t * m, t = 0;
        else {
            int a = min(r / y - x + 1, t);
            r -= y * a;
            t -= a;
        }
    }
    return r <= 0;
}

int erfen(int l, int r) {
    int num = 0;
    while (l <= r) {
        int mid = (l + r) / 2;
        if (check(mid)) num = mid, l = mid + 1;
        else r = mid - 1;
    }
    return num;
}

signed main() {
    n = read(), k = read(), m = read();
    int l = 1, r = n;
    ans = erfen(l, r);
    printf("%lld\n", ans);
    return 0;
}

标签:lfloor,int,题解,Loan,rfloor,合法,USACO20JAN,dfrac,复杂度
From: https://www.cnblogs.com/agrumestly/p/17398376.html

相关文章

  • 【题解】Luogu[P8818] CSP-S 2022 策略游戏
    一道简单区间rmq分类讨论题,考场上最后5分钟想出来,没写出来,退役了……给定两个序列\(A_{1},\dots,A_{n}\);\(B_1,\dots,B_n\)规定\(C_{i,j}=A_i\timesB_i\)。题目说小L和小Q必定选择最优策略,而小L先选,小Q后选,小L要使得\(C_{i,j}\)尽可能大,小Q要使得\(C_{i,j}\)......
  • 【题解】Luogu[P1879] [USACO06NOV]Corn Fields G
    Link→状压dp典题,看数据范围就能多半猜到是状压。\(M\)行\(N\)列很不舒服,本篇题解规定为\(N\)行\(M\)列。因为说没有哪两块草地相连,我们不妨一行一行考虑,一行中每格只可能是\(0\)或\(1\),所以一行的总不同状态数是\(2^M\)。我们用二进制表示每一行的状态,对于每一行,暴......
  • 【题解】Luogu[P1967] NOIP2013 提高组 货车运输
    Link→很容易想到一个暴力做法,就是跑一遍Floyd,\(F_{i,j}\)表示\(i\)到\(j\)最大载重量,转移\(F_{i,j}=\max\{F_{i,j},\min\{F_{i,k},F_{k,j}\}\}\)。显然时间复杂度\(O(n^3)\)是过不了的。我们发现,因为是求两点路径中使得最小值最大,实际上有一些较小的路径是不会走......
  • CF1698F题解
    考虑一个函数\(f(a)\),它的返回值是一个二维数组\(b\),接受值是一个数组\(a\)。对于所有\(i=1\ton-1\)的\(i\),把\(b_{a_i}{a_{i+1}}++\),然后返回\(b\)。\(f(a)!=f(b)\)且\(a_1=b_1,a_n=b_n\)是无解的充要条件,因为显然对于数组的每次翻转操作它的\(f\)返回值都不会变。\(f(a)!=f(b......
  • CF1777D Score of a Tree 题解
    题目简述给你一个\(n\)个结点根为\(1\)的树。在\(t=0\)时,每个结点都有一个值,为\(0\)或\(1\)。在每一个\(t>0\)时,每个结点的值都会变成其子结点在\(t-1\)时的值的异或和。定义\(S(t)\)为\(t\)时所有结点值的和。定义\(F(A)\)为树在\(0\let\le10^......
  • CF1777C Quiz Master题解
    题目简述给定一个长度为\(n\)的正整数序列\(a\),以及一个正整数\(m\)。在序列\(a\)中选出一个长度为子序列(不是子段)\(b\),\(\foralli\in[1,m],\existsb_j,b_j\)能整除\(i\)。求所有满足条件的序列\(b\)的极差(最大值于最小值的差)的最小值;若无满足条件序列\(b\)......
  • Educational Codeforces Round 148 (Rated for Div. 2) A-D 题解
    比赛地址A.NewPalindrome题意:给一个回文串,判断是否能重新排成另一个回文串Solution存不同对的个数即可voidsolve(){ strings; cin>>s; intn=s.length(); set<char>st; for(inti=0;i<n/2;i++) { st.insert(s[i]); } if(st.size()>1)cout<<"YES\n"; els......
  • 「SDOI2017」数字表格 题解
    4114「SDOI2017」数字表格题解个人评价:好题且套路多算法标签莫比乌斯反演题目难度:2700题面看我分析题面多组数据,每次给出\(n,m\),求解\(\prod_{i=1}^n\prod_{j=1}^mF_{gcd(i,j)}\),其中\(F\)是斐波那契数列问题分析第一眼化出这个式子肯定是一脸懵,毕竟我们现在做的大......
  • 问题解决:TNS-12543: TNS:destination host unreachable
    环境:11.2.0.3ADG(db11g\db11gadg\db11gcas)在自己先前克隆后的环境互相tnsping报错。tnsping本机ok,tnsping其他机器均报错:[oracle@db11g~]$tnspingjingyuTNSPingUtilityforLinux:Version11.2.0.3.0-Productionon13-MAY-202308:09:11Copyright(c)1997,......
  • cf 870div2 abcd题解
    A题,先假设一个res从0开始,判断说谎人的个数用ans表示,如果res==ans则假设成立#include<iostream>usingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;typedefdoubledb;typedefpair<int,int>PII;constllINF=0x3f3f3f3f;constintN=1e4+10;in......