Chocolate
提供一种比较清新的做法。
思路:贪心。
思考:如果在巧克力上横向切一刀,那么纵向要切的刀数就会加一。如果在巧克力上纵向切一刀,那么横向要切的刀数就会加一。
结论:要先切代价大的,再切代价小的。
做法:横切代价与纵切代价放到一起排序,依次计算需要的代价即可。
#include <bits/stdc++.h>
using namespace std;
struct node{
int xy;
bool flag;//flag区分是纵切代价还是横切代价。
}a[20010];
int cnt[2];//cnt[i]代表在某个方向上已经有多少块巧克力。
bool cmp(node a,node b){
return a.xy>b.xy;
}
int main()
{
int n,m;
long long ans=0;
cin>>n>>m;
n--;
m--;
for(int i=1;i<=n;i++)cin>>a[i].xy;
for(int i=1;i<=m;i++){
cin>>a[i+n].xy;
a[i+n].flag=1;
}
sort(a+1,a+n+m+1,cmp);
for(int i=1;i<=n+m;i++) {
ans+=(long long)a[i].xy*(cnt[!a[i].flag]+1);//用当前方向的代价去乘以另一个方向上的块数。
cnt[a[i].flag]++;//切了一刀,块数加一。
}
cout<<ans;
return 0;
}

浙公网安备 33010602011771号