2025-09-12 学习日记

发布于 2025-09-12 12:00 754 字 4 min read 手写 每个字都是我自己敲的。

2025-12-24 学习日记2025-12-17 学习日记2025-12-14 学习日记2025-12-09 学习日记2025-12-08 学习日记2025-12-07 学习日记2025-12-06 学习日记2025-12-05 学习日记2025-12-04 学习日记2025-12-03 学习日记2025-12-02 学习日记2025-12-01 学习日记2025-11-30 学习日记2025-11-29 学习日记2025-11-28 学习日记2025-11-27 学习日记2025-11-26 学习日记2025-11-25 学习日记2025-11-24 学习日记2025-11-23 学习日记2025-11-22 学习日记2025-11-21 学习日记2025-11-20 学习日记2025-11-19 学习日记2025-11-18 学习日记2025-11-17 学习日记2025-11-16 学习日记2025-11-15 学习日记2025-11-14 学习日记2025-11-13 学习日记2025-11-12 学习日记2025-11-11 学习日记2025-11-10 学习日记2025-11-09 学习日记2025-11-08 学习日记2025-11-07 学习日记2025-11-06 学习日记2025-11-05 学习日记2025-11-04 学习日记2025-11-03 学习日记2025-11-02 学习日记2025-11-01 学习日记2025-10-31 学习日记2025-10-30 学习日记2025-10-29 学习日记2025-10-28 学习日记2025-10-27 学习日记2025-10-26 学习日记2025-10-25 学习日记2025-10-24 学习日记2025-10-23 学习日记2025-10-22 学习日记2025-10-21 学习日记2025-10-20 学习日记2025-10-19 学习日记2025-10-18 学习日记2025-10-17 学习日记2025-10-16 学习日记2025-10-15 学习日记2025-10-14 学习日记2025-10-13 学习日记2025-10-11 学习日记2025-10-10 学习日记2025-10-09 学习日记2025-10-03 学习日记2025-10-02 学习日记2025-10-01 学习日记2025-09-30 学习日记2025-09-29 学习日记2025-09-28 学习日记2025-09-27 学习日记2025-09-26 学习日记2025-09-25 学习日记2025-09-24 学习日记2025-09-23 学习日记2025-09-22 学习日记2025-09-21 学习日记2025-09-20 学习日记2025-09-18 学习日记2025-09-17 学习日记2025-09-16 学习日记2025-09-15 学习日记2025-09-14 学习日记2025-09-13 学习日记2025-09-12 学习日记2025-09-11 学习日记2025-09-10 学习日记2025-09-09 学习日记2025-09-08 学习日记2025-09-04 学习日记2025-09-03 学习日记2025-09-02 学习日记2025-09-01 学习日记2025-08-31 学习日记2025-08-29 学习日记2025-08-28 学习日记2025-08-27 学习日记2025-08-26 学习日记2025-08-25 学习日记2025-08-24 周记2025-08-23 学习日记2025-08-22 学习日记2025-08-21 学习日记2025-08-20 学习日记2025-08-19 学习日记2025-08-18 学习日记2025-08-17 周记2025-08-16 学习日记2025-08-15 学习日记2025-08-14 学习日记2025-08-13 学习日记2025-08-12 学习日记2025-08-11 学习日记
今日学习记录 1. 小红的数组操作2024 年第七届传智杯程序设计挑战赛初赛.G_2024年第七届传智杯程序设计挑战赛初赛(重现赛)](https://ac.nowcoder.com/acm/contest/117501/G)) 关键词: 问题分析: 小红拿到了一个数组,她每次可以进行如下操作:选择一个数,使其减去 x,小红希望 kkk...

今日学习记录

1. 小红的数组操作2024 年第七届传智杯程序设计挑战赛初赛.G

关键词:二分答案 问题分析:

  1. 小红拿到了一个数组,她每次可以进行如下操作
    ,使其减去 x,小红希望 kkk 次操作之后,该数组的最大值尽可能小.请你求出这个尽可能小的最大值.

核心思路

  1. 经典的优先队列,直接做很简单,狗都会做
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n,k,x;cin>>n>>k>>x;
    priority_queue<int,vector<int>> pq;
    while(n--){
        int m;cin>>m;
        pq.push(m);
    }
    while(k>0){
        int p = pq.top();
        pq.pop();
        while(k>0&&p>=pq.top()) p -=x,k--;
        pq.push(p);
    }
    cout<<pq.top();
    return 0;
}

但这可是 G 题啊,肯定没这么简单,看看题目给的数量级,k 最大可以到 1e9,就是说要操作 1e9 次,使用优先队列必然会超时,大大滴超时,只能过 1.11 分,说明题目刻意呢 2. 那么该怎么做呢,我们来模拟一下答案的反过程,比如,我先知道答案,那么就要把数组中所有的数都要减去 x,直到这个数小于答案,然后看减去的操作次数是否等于 k,大于 k,就说明答案小了,小于 k,说明答案大了,那么再想想答案的极端情况,可以发现答案的单调性,这样我可以直接使用二分答案来做,而且 check 函数比较好写 但是,你以为这就完了吗?这才刚刚开始,这道题难的是边界处理,我吃了 10 发 w 才试出边界,这个边界确实不好想,因为按道理来说他给出的值,a 最大值应该为 1e9 左右,而二分上下限就应该是搜索答案的范围,即上界就应该为 1e9 左右,但是这个题的上下界很难分辨,答案按道理来说是不可能为负数,但是搜索范围要搜到-1e18,你就说 n 不 nb 吧,而且上界要搜到 1e18,所以这个题的难点就在这里,可以一直试答案

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6+5;
ll n, k, x;
ll a[N];
bool check(ll target) {
    ll operations = 0;
    for (int i = 0;i<n;i++) {
        if (a[i] > target) {
            ll needed = (a[i] - target + x - 1) / x;
            operations += needed;
            if (operations > k) {
                return false;
            }
        }
    }
    return true; 
}

int main() {
    cin >> n >> k >> x;
    for (ll i = 0; i < n; i++) {
        cin >> a[i];
    }
    ll left = -1e18;
    ll right = 1e18;
    ll ans = 0;
    while (left <= right) {
        ll mid = left + (right - left) / 2;
        if (check(mid)) {
            ans = mid;
            right = mid - 1;
        } else {
            left = mid + 1; 
        }
    }
    cout << ans << endl;
    return 0;
}

只能说尽量开大点边界,避免漏解

学到的点:

  1. 二分边界处理

今日收获

  1. 待加强

  2. 明日计划:

    • [ ]
    • [ ]

执笔 手写

随机文章

加载中...