题意:有n个条龙,在雇佣勇士去杀,每个勇士能力值为x,只能杀死头的直径y小于或等于自己能力值的龙,只能被雇佣一次,并且你要给x赏金,求最少的赏金。
析:很简单么,很明显,能力值高的杀直径大的,低的杀直径小的。所以我们先对勇士能力值从小到大排序,然后对龙的直径从小到大排序,
然后扫一遍即可,如某个勇士杀不龙,就可以跳过,扫到最后,如果杀完了就结束,输出费用,否则就是杀不完。
代码如下:
#include <iostream> #include <cstdio> #include <climits> #include <cmath> #include <algorithm> #include <cstring> #include <map> using namespace std; const int maxn = 20000 + 10; int a[maxn], b[maxn]; int main(){ int n, m; while(scanf("%d %d", &n, &m) && m && n){ for(int i = 0; i < n; ++i) scanf("%d", &a[i]); for(int i = 0; i < m; ++i) scanf("%d", &b[i]); sort(a, a+n); sort(b, b+m); if(n > m){ printf("Loowater is doomed!\n"); continue; }//勇士太少,直接结束 int cnt = 0, cost = 0; for(int i = 0; i < m; ++i) if(b[i] >= a[cnt]){ cost += b[i];//记下费用 if(++cnt == n) break;//龙杀完了,提前退出 } if(cnt < n) printf("Loowater is doomed!\n"); else printf("%d\n", cost); } return 0; }
时间: 2024-10-10 09:59:40