贪心题解
2026-02-06 21:44:16
发布于:广东
4阅读
0回复
0点赞
思路
问题在于怎么贪心。
推荐一组样例:
输入
4 2
4 5 6
1
输出
19
解释一下这组样例。图长这样:

如果先切横的,结果就是 。
如果先切竖的,结果就是 。
显然先切竖的更优。
由此,可以得出一个结论:先切代价大的。
于是,思路就出来了。先把两个数组从大到小排序,然后两个数组挨个比较,较大的就在答案上加上这个代价(要乘上切了多少刀),再把指针往后挪一位,直到全部算完即可。
细节
这道题细节还是蛮多的。
1.是先取大的,不是先取小的。
2.注意是n−1和m−1,不能算成n和m。
3.最后的答案要开long long。
于是就可以愉快地AC了!
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=205;
int a[MAXN],b[MAXN];//横线和竖线的代价
bool cmp(int aa,int bb){
return aa > bb;
}//从大到小
int main(){
int n,m,s1= 1 ,s2 = 1;//s1和s2可以是a数组和b数组的指针,也可以是横纵分成的块数
cin >> n >> m;
for(int i = 1;i < n;i++){
cin >> a[i];
}
for(int i = 1;i < m;i++){
cin >> b[i];
}
sort(a + 1,a + n,cmp);
sort(b + 1,b + m,cmp);//从大到小排序
long long ans = 0;//记录答案,注意long long
for(int i = 2;i < n + m;i++){//遍历
if(a[s1] > b[s2]){
ans += s2 * a[s1++];//选择大的,这里s2表示块数,s1指针后移一位
}else{
ans += s1 * b[s2++];//同理,和上面相反
}
}
cout << ans;
return 0;//华丽结束
}
这里空空如也







有帮助,赞一个