优质题解|粮草
2026-05-12 17:27:35
发布于:浙江
12阅读
0回复
0点赞
普通贪心:
#include<iostream>
using namespace std;
const int N=1e6;
int a[N],b[N];
int main(){
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
for(int i=1;i<=m;i++){
for(int i1=1;i1<=m-i;i1++){
if(a[i1]>a[i1+1]){
swap(a[i1],a[i1+1]);
swap(b[i1],b[i1+1]);
}
}
}
int c=0,i=1;
while(n>0){
int x=min(b[i],n);
c+=a[i]*x;
n-=x;
i++;
}
cout<<c;
return 0;
}
改题步骤:
1.输入解析:
- 读 n(需求数量)、m(农户数);
- 读 m 行,每行 p a(单价、可售量)。
2.贪心策略:
- 将农户按 单价 升序排序(单价低者优先);
- 依次购买:每次取 min(剩余需求, 当前农户可售量) 单位,累加花费;
- 若某次购买后需求降为 0,则终止。
3.数据结构选择:
- 使用 vector<pair<int, int>> farmers,存 (price, amount);
- sort(farmers.begin(), farmers.end()) —— pair 默认按 first(price)升序排 ✅
4.时间复杂度:
- 排序:O(mlogm),m≤5000 → 极快;
- 贪心扫描:O(m);
- 总复杂度:O(mlogm),最优。
改过的进阶贪心:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
int m;
cin >> n >> m;
if (n == 0) {
cout << 0 << '\n';
return 0;
}
vector<pair<int, int>> farmers;
for (int i = 0; i < m; i++) {
int p, a;
cin >> p >> a;
farmers.emplace_back(p, a);
}
sort(farmers.begin(), farmers.end());
long long cost = 0;
long long remaining = n;
for (auto& [p,a] : farmers) {
if (remaining <= 0) break;
long long buy = min(remaining, (long long)a);
cost += (long long)p * buy;
remaining -= buy;
}
cout << cost << '\n';
return 0;
}
这里空空如也








有帮助,赞一个