题目链接:http://www.tyvj.cn/p/1094
题解:
模拟切割的过程,注意到切割的次序越往后,值越大,所以每次选取当前数组中最大的,再弹出。结果比较好求,想想就切了,有意思的一道小题。
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
const int size = 10005;
struct _mat{
int cost;
int flag;
bool operator< (_mat a) const {
return cost > a.cost;
}
} mat[size];
int n, m;
int fa = 1, fb = 1;
int main() {
scanf("%d %d", &n, &m);
// 1~n-1
for ( int i = 1; i < n; i ++ ) scanf("%d", &mat[i].cost);
// n~n+m-1
for ( int i = n; i < n+m-1; i ++ ){ scanf("%d", &mat[i].cost); mat[i].flag = 1; }
sort(mat+1, mat+n+m);
int ans = 0;
for ( int i = 1; i < n+m; i ++ ) {
if(mat[i].flag) { fa ++; ans += mat[i].cost*fb; }
else { fb ++; ans += mat[i].cost*fa; }
}
printf("%d\n", ans);
return 0;
}