题号 NC25043
名称 Protecting the Flower
来源 USACO英文版-2007 January Contest-Silver
解题思路
题目要求奶牛总共破坏的花朵最少,牵奶牛的顺序至关重要。
假设有两头奶牛 cow1 和 cow2,如果先牵走第 1 头奶牛,那么破坏的花朵是 2 * cow1[0] * cow2[1],如果先牵第 2 头奶牛,共破坏花朵 2 * cow2[0] * cow1[1]。
根据题意, 先牵破坏花朵少的对应的那头奶牛。
确定了牵奶牛的顺序,再计算花朵的总破坏量。
使用 sum 记录所有奶牛每分钟花朵破坏量,每牵走一头奶牛,减去其对应的破坏量。将 sum * cows[i][0] * 2 累计加入结果 ans。
C++代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool comp(vector<int> &cow1, vector<int> &cow2){
return cow1[0]*cow2[1] < cow2[0]*cow1[1];
}
int main(){
int N;
cin >> N;
vector<vector<int>> cows(N, vector<int>(2));
for(int i=0; i<N; ++i){
cin >> cows[i][0] >> cows[i][1];
}
sort(cows.begin(), cows.end(), comp);
long long sum = 0;
for(int i=0; i<N; ++i){
sum += cows[i][1];
}
long long ans = 0;
for(int i=0; i<N-1; ++i){
sum -= cows[i][1];
ans += sum * cows[i][0] * 2;
}
cout << ans << endl;
return 0;
}
京公网安备 11010502036488号