CSP202303-2垦田计划

题目链接http://118.190.20.162/view.page?gpid=T164
这个代码只能拿85分

img

#include<iostream>
#include<map>
using namespace std;
int main(){
    long long n,m,k,ti,ci,t;
    map<long long,long long,greater<>>field;
    cin>>n>>m>>k;
    while(n--){
        cin>>ti>>ci;
        field[ti]+=ci;
    }
    for(auto it=field.begin();it!=field.end();it++){
        if(it== prev(field.end())){
            while(m>=it->second){
                t--;
                m-=it->second;
            }
            break;
        }
        auto next=it;
        next++;
        long long cost=it->second*(it->first-next->first);
        if(m<cost||t==k)
            break;
        t=next->first;
        m-=cost;
        next->second+=it->second;
    }
    t=t>=k?t:k;
    cout<<t;
}

【以下回答由 GPT 生成】

根据给出的C++代码,以下是对代码进行优化的几个可能的步骤:

  1. 避免使用using namespace std;: 该语句可能引入命名冲突和不必要的依赖,建议使用std::前缀来指定命名空间。

  2. 避免使用mapgreater<>排序方式: map默认使用元素的键值进行排序,可以省略排序方式参数,替换为std::map<long long,long long>。避免使用greater<>可以提高性能。

  3. 改进循环: 在处理田地的种植时间和花费时,可以使用C++11提供的循环范围(range-based)for循环代替传统的for循环和迭代器。这样可以简化代码,提高可读性。

  4. 避免使用break: break语句可以提前跳出循环,但它有时会导致控制流变得复杂。可以通过合理的逻辑重构,避免使用break语句,提高代码的可读性和维护性。

以下是优化后的代码:

#include <iostream>
#include <map>

int main() {
    long long n, m, k, ti, ci, t = 0;
    std::cin >> n >> m >> k;
    std::map<long long, long long> field;

    for (int i = 0; i < n; i++) {
        std::cin >> ti >> ci;
        field[ti] += ci;
    }

    for (const auto& [curr, curr_count] : field) {
        const auto& [next, next_count] = *std::next(field.find(curr));
        long long cost = curr_count * (curr - next);

        if (m < cost || t == k) {
            break;
        }

        t = next;
        m -= cost;
        field[next] += curr_count;
    }

    t = t >= k ? t : k;
    std::cout << t;

    return 0;
}

这些优化措施可以提高代码的可读性、性能和可维护性,从而提高得分。请注意,具体的得分提升取决于输入数据和题目评分标准,因此无法确保能够达到满分。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^