题目链接http://118.190.20.162/view.page?gpid=T164
这个代码只能拿85分
#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++代码,以下是对代码进行优化的几个可能的步骤:
避免使用using namespace std;
: 该语句可能引入命名冲突和不必要的依赖,建议使用std::
前缀来指定命名空间。
避免使用map
的greater<>
排序方式: map
默认使用元素的键值进行排序,可以省略排序方式参数,替换为std::map<long long,long long>
。避免使用greater<>
可以提高性能。
改进循环: 在处理田地的种植时间和花费时,可以使用C++11提供的循环范围(range-based)for
循环代替传统的for
循环和迭代器。这样可以简化代码,提高可读性。
避免使用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;
}
这些优化措施可以提高代码的可读性、性能和可维护性,从而提高得分。请注意,具体的得分提升取决于输入数据和题目评分标准,因此无法确保能够达到满分。
【相关推荐】