贪心+优先队列

来源:互联网 发布:深圳网络问政平台 编辑:程序博客网 时间:2024/06/06 18:28

Description

  湫湫减肥 
  越减越肥! 
   
  最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏。 
  游戏规则很简单,用箭杀死免子即可。 
  箭是一种消耗品,已知有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 31 2 32 3 41 2 33 41 2 31 2 3 41 2 3 1

Sample Output

#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>#include <queue>using namespace std;int ra[100005];struct node{int w;    //伤害值 int q;     // Q币价值 friend bool operator<(node a,node b){return a.q>b.q;   //优先队列,花费最小的在对头 }}all[100005];bool cmp(int a,int b)  {return a>b;}bool cmp1(node a,node b){return a.w>b.w;}int main(){int n,m,i,j;while(~scanf("%d %d",&n,&m)){for(i=0;i<n;i++)scanf("%d",&ra[i]);for(i=0;i<m;i++)scanf("%d",&all[i].w);for(i=0;i<m;i++)scanf("%d",&all[i].q);sort(ra,ra+n,cmp);      //兔子排序 sort(all,all+m,cmp1);   //按照箭的伤害由大到小排序 j=0;long long sum=0;int flag=1;priority_queue<node> pq; //创建优先队列 for(i=0;i<n;i++){    while(all[j].w>=ra[i]&&j<m)//*如果该箭能杀死兔子,入队     pq.push(all[j++]);if(pq.empty())    //如果队列为空,无法杀死当前兔子 {flag=0;break;}sum+=pq.top().q;  //总Q币 pq.pop();         // 弹出该箭 }if(flag==0)printf("No\n");else printf("%lld\n",sum);}return 0; } 

priority_queue<int,vector<int>,greater<int> > q; //从小到大排序
        
priority_queue<int,vector<int>,less<int> > q;     //从大到小排序

0 0
原创粉丝点击