前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【第60题】还账,九牛二虎之力AC掉 [NOIP2018 普及组] 龙虎斗

【第60题】还账,九牛二虎之力AC掉 [NOIP2018 普及组] 龙虎斗

作者头像
小码匠
发布2023-08-31 15:06:44
1650
发布2023-08-31 15:06:44
举报

碎碎念

  • 这道题2022年8月第一次做,没AC掉,只得了72分;
  • 虽然是道普及-, 今天也是废了九牛二虎之力才AC掉的,题解中第3点是我今后写代码要注意的。

题目: [NOIP2018 普及组] 龙虎斗

题目原文请移步下面的链接

  • https://www.luogu.com.cn/problem/P5016
    • 参考题解:https://www.luogu.com.cn/problem/solution/P5016
  • 标签:OINOIP模拟枚举
  • 难度:普及-

题解

  • 先判断哪一方现有的多(别忘加后补的),然后通过用二者所差数除以s2再乘上s2来算在哪个位置能使二者数据更接近,如果本来就一样那就输出m就行
  • 这里有一个坑点就是算出来的位置可能越界,所以一定要进行判断
  • 判断条件写太长容易把自己绕进去,很容易导致最后判断出现错误,最好避免!!!
思路
  • 题解大家可移步看这里,很多童鞋写了各种解法
    • https://www.luogu.com.cn/problem/solution/P5016
代码:88分
  • 头次遇到这么吉利的分数,但我要AC啊,我不要这个吉利数!
代码语言:javascript
复制
#include <bits/stdc++.h>

using namespace std;
#define endl '\n';
typedef long long LL;

void best_coder() {
    // 提升cin、cout效率
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    LL n, m, p1, s1, s2;
    cin >> n;
    vector<LL> v(n + 1);
    for (LL i = 1; i <= n; ++i) {
        cin >> v[i];
    }

    cin >> m >> p1 >> s1 >> s2;
    LL a = 0, b = 0;
    for (LL i = 1; i < m; ++i) {
        a += v[i] * (m - i);
    }
    for (LL i = m + 1; i <= n; i++) {
        b += v[i] * (i - m);
    }
    if (p1 <= m - 1)  {
        a += s1 * (m - p1);
    }
    if (p1 >= m + 1) {
        b += s1 * (p1 - m);
    }
    if (a == b) {
        printf("%lld", m);
        return;
    }
    LL t = 0;
    if (abs(a - b) - abs(a - b) / s2 * s2 > abs(a - b) / s2 * s2 + s2 - abs(a - b)) {
        ++t;
    }
    if (a < b) {
        long long one = 1;
        cout << max(one,  m - abs(a - b) / s2);
    }
    else if (a > b) {
        cout << min(n, m + abs(a - b) / s2 + t);
    }
}

void happy_coder() {
    // 提升cin、cout效率
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
}

int main() {
    // 小码匠
    best_coder();

    // 最优解
    //happy_coder();
    return 0;
}
AC代码
代码语言:javascript
复制
#include <bits/stdc++.h>

using namespace std;
#define endl '\n';
typedef long long LL;

void best_coder() {
    // 提升cin、cout效率
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    LL n, m, p1, s1, s2;
    cin >> n;
    vector<LL> v(n + 1);
    for (LL i = 1; i <= n; ++i) {
        cin >> v[i];
    }

    cin >> m >> p1 >> s1 >> s2;
    LL a = 0, b = 0;
    for (LL i = 1; i < m; ++i) {
        a += v[i] * (m - i);
    }
    for (LL i = m + 1; i <= n; i++) {
        b += v[i] * (i - m);
    }
    if (p1 <= m - 1) {
        a += s1 * (m - p1);
    }
    if (p1 >= m + 1) {
        b += s1 * (p1 - m);
    }
    if (a == b) {
        cout << m;
        return;
    }
    LL l = abs(a - b);
    LL t = l / s2;
    LL cnt = t * s2;
    if (l - cnt > cnt + s2 - l) {
        ++t;
    }

    if (a < b) {
        long long one = 1;
        cout << max(one, m - t);
    } else if (a > b) {
        cout << min(n, m + t);
    }
}

void happy_coder() {
    // 提升cin、cout效率
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
}

int main() {
    // 小码匠
    best_coder();

    // 最优解
    //happy_coder();
    return 0;
}

END

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小码匠和老码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目: [NOIP2018 普及组] 龙虎斗
  • 题解
    • 思路
      • 代码:88分
        • AC代码
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档