51nod 挑剔的美食家
因为要找最小的价格呀
所以对于每个牛 我们都去找最小的满足条件的草
将牛和草 的鲜嫩程度从大到小排序
然后 依次枚举牛
用 multiset来保存所有满足条件的草的价格
然后去二分找 第一个大于等于 第i个牛的要求的价格的值 找到之后就erase一下 否则就输出-1
因为草的鲜嫩程度是从大到小的
所以满足第一个牛的所有草 它的鲜嫩程度一定满足第二个牛
#include <cstdio> #include <utility> #include <iostream> #include <set> #include <algorithm> using namespace std; const int maxn = 100100; struct node{ int value; // 价格 int neng; // 鲜嫩程度 }; bool cmp(node left, node right){ return left.neng > right.neng; } multiset<int > s; // 因为不同草的定价相同 multiset<int > :: iterator it; node cow[maxn]; // 牛 node grass[maxn]; // 草 int main(){ int n, m; long long int ans = 0; scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++){ scanf("%d%d", &cow[i].value, &cow[i].neng); } for(int i = 1; i <= m; i++){ scanf("%d%d", &grass[i].value, &grass[i].neng); } // 按照草的新鲜程度从大到小排序 sort(cow + 1, cow + 1 + n, cmp); sort(grass + 1, grass + 1 + m, cmp); int num = 1; for(int i = 1; i <= n; i++){ while(num <= m && grass[num].neng >= cow[i].neng){ s.insert(grass[num].value); num++; } //for(it = s.begin(); it != s.end(); ++it){ // cout << *it << " "; //} cout << endl; it = s.lower_bound(cow[i].value); // 找到第一个大于等于第i个牛的要求的最低价 //cout << *it << endl; if(it == s.end()){ puts("-1"); return 0; } ans += *it; s.erase(it); } printf("%lld\n", ans); return 0; }