hdu 4544——消灭兔子
游戏规则很简单,用箭杀死免子即可。
箭是一种消耗品,已知有M种不同类型的箭可以选择,并且每种箭都会对兔子造成伤害,对应的伤害值分别为Di(1 <= i <= M),每种箭需要一定的QQ币购买。
假设每种箭只能使用一次,每只免子也只能被射一次,请计算要消灭地图上的所有兔子最少需要的QQ币。
Input输入数据有多组,每组数据有四行;
第一行有两个整数N,M(1 <= N, M <= 100000),分别表示兔子的个数和箭的种类;
第二行有N个正整数,分别表示兔子的血量Bi(1 <= i <= N);
第三行有M个正整数,表示每把箭所能造成的伤害值Di(1 <= i <= M);
第四行有M个正整数,表示每把箭需要花费的QQ币Pi(1 <= i <= M)。
特别说明:
1、当箭的伤害值大于等于兔子的血量时,就能将兔子杀死;
2、血量Bi,箭的伤害值Di,箭的价格Pi,均小于等于100000。Output如果不能杀死所有兔子,请输出”No”,否则,请输出最少的QQ币数,每组输出一行。Sample Input
3 3 1 2 3 2 3 4 1 2 3 3 4 1 2 3 1 2 3 4 1 2 3 1
Sample Output
6 4
题目思路很简单,也很容易想到解题策略
分析:
将兔子血量降序排序,,将箭的伤害值升序排序,丛箭的伤害值高的地方遍历,找出能够杀死此兔子的箭,分别将箭的qq币放入从小到大排序的优先队列,利用k遍历有效的防止重复使用箭,
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cstdlib> 6 #include<queue> 7 using namespace std; 8 const int maxn = 1e5+10; 9 #define ll long long 10 struct node{ 11 int x,y; 12 }b[maxn]; 13 14 inline bool cmp1(int x,int y){ 15 return x>y; 16 } 17 bool cmp(node t1, node t2){ 18 return t1.x<t2.x; 19 } 20 priority_queue<int,vector<int>,greater<int> > q; 21 int main(){ 22 int n,m,a[maxn];//a代表兔子 23 while(scanf("%d%d",&n,&m)!=EOF){ 24 while(!q.empty()) q.pop(); 25 26 int flag=0; 27 ll ans=0;//最后用的QQ币的数量 28 for( int i=0; i<n; i++ ){ 29 cin>>a[i];//输入兔子血量 30 } 31 for( int i=0; i<m; i++ ){ 32 cin>>b[i].x;//输入箭的伤害值 33 } 34 for( int i=0; i<m; i++ ){ 35 cin>>b[i].y;//输入箭的花费 36 } 37 if(n>m){//不能杀死所有的兔子 38 cout<<"No"<<endl; 39 continue; 40 } 41 sort(a,a+n,cmp1);//将兔子血量与箭的伤害值排下序 42 sort(b,b+m,cmp); 43 44 int k=m-1; 45 for( int i=0; i<n; i++ ){//对于每只兔子 46 while(k>=0&&b[k].x>=a[i]){//吧能杀死兔子的箭按照从小到大排序放入优先队列 47 q.push(b[k].y); 48 k--; 49 } 50 if(q.empty()){ 51 flag=1;//说明这只兔子不能被杀死 52 break; 53 } 54 ans+=q.top(); 55 q.pop(); 56 } 57 if(!flag) 58 cout<<ans<<endl; 59 else 60 cout<<"No"<<endl; 61 62 } 63 return 0; 64 } 65
有些目标看似很遥远,但只要付出足够多的努力,这一切总有可能实现!