参考y神的思路QWQ
算法:贪心
对于每一个任务:
-
$y$ 的差异最多能使利润$w$浮动$2 * 100 = 200$元。
-
$x$ 差$1$,则会使利润$w$浮动$500$元
所以,$y$对利润的影响较小,$x$与其利润$w$的关系成对应关系(即$x_{i} < x_{j}$,则$w_{i}<w_{j}$,仅当$x_{i} = x_{j}$,再按照$y$考虑即可。
策略可以变成以$x$从大到小的顺序考虑每一个任务,如果能匹配机器,则从能匹配的机器中选择机器$y$最小的一个。
匹配机器
-
先用$x$分别从大到小排序任务与机器。
-
对于每一个任务,把时间充足的机器放入集合中。
-
若存在,从集合中找出级别最低的机器使用,并且从集合中删除那个机器。
这种处理顺序可以保证:在处理第下一个任务时,集合中的机器时间都是充足的。且找机器的时间复杂度处于$O(M+N)$级别。
$STL$的$\text{multiset}$恰好支持从序列中查找大于等于某数的最小值。
时间复杂度:O(MlogN + N)
$\text{multiset}$的$lowerbound$时间为$O(logN)$的…
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
typedef pair<int,int> PII;
const int N = 100000 + 10;
int n, m;
PII a[N],b[N];
int main(){
while(cin >> n >> m){
for(int i = 1; i <= n; i++) cin >> a[i].first >> a[i].second;
for(int i = 1; i <= m; i++) cin >> b[i].first >> b[i].second;
sort(a + 1,a + 1 + n); sort(b + 1,b + 1 + m);
multiset<int> s; s.clear();
long long cnt = 0, ans = 0;
for(int i = m, j = n; i >= 1; i--){
//将时间足够的机器放到set中
while(j >= 1 && b[i].first <= a[j].first)s.insert(a[j--].second);
multiset<int>::iterator it = s.lower_bound(b[i].second);
if(it != s.end()){
cnt ++;
ans += 500 * b[i].first + 2 * b[i].second;
s.erase(it);
}
}
cout << cnt << " " << ans << endl;
}
return 0;
}
空子是神!!!
哎呦
6
墨染空参加NOI2022失利退役?
从小到大排序影响正确性吗?
不是本来就从小到大排的序吗
我的意思是从小往大扫
为什么
s.clear();
不放在for
循环里呢?%%%
wssb,竟然没观察到y的数据范围!tql!
加油ヾ(◍°∇°◍)ノ゙
?
HH 说错了 您已经可以躺平了~
为啥都是以任务视角(第一层循环都是 for(int i = m, j = n; i >= 1; i–){)
选择合适的机器,在从合适的机器集合中贪心出答案机器。
如果以机器视角能解吗? 还是不好写呢?
我觉得应该不是很好写,例如如果是按按机器人从大到小排序,那么打大的机器人选择的有很多你不知道应该先选那个,如果先选价值大的就会出现这样的问题,例如一个机器人102 4, 102 2 任务102 1, 100 3如果按照这样的话就会导致后一个任务没办法安排。如果从大到小排也可能出现先选了价值大的前一个后一个没办法选,例如机器人99 101, 100 100, 任务 99 1, 97 101
但是以任务视角就不一样了如果这个任务可以被选那么我一定会选,因为这个任务首先对于一些机器人来说一定是可以的,也就是时间和级别机器人都可以承受,又因为这个任务价值最大那么后面的任务如果也可以占用这个机器人的话 由于我们是按照时间从大到小排序的那么后面的站用这个机器人的任务肯定是没有选当前机任务更好的
喜欢这个码风
现在这个码风已经消失了…
讲的简洁清晰,代码也很好看,神犇没错了,收下我的赞
不过提醒一点,你实现用的是multiset
笔误,修正了,当时还很菜(当然现在也很菜)
现在不是大神嘛 cf都橙了
现在也很菜,cf已经6个月没上分了
关键就在x,y范围和最大/小值了
感谢
没学stl,只会用简单的结构体写一个
但10,15那组没卡过去
你 O(nm) 复杂度肯定炸啊
并且对于每个i你要找到的是b[i].times最小的且满足条件的,所以枚举顺序也有问题