hdu 4544 优先队列+贪心
题意:最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏。
游戏规则很简单,用箭杀死免子即可。
箭是一种消耗品,已知有M种不同类型的箭可以选择,并且每种箭都会对兔子造成伤害,对应的伤害值分别为Di(1 <= i <= M),每种箭需要一定的QQ币购买。
假设每种箭只能使用一次,每只免子也只能被射一次,请计算要消灭地图上的所有兔子最少需要的QQ币。
链接:点我
贪心在能杀死某个兔子的箭里选择价格最小的
一开始直接两个for,tle,看了别人代码之后才知道用优先队列
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 #define cl(a) memset(a,0,sizeof(a)) 13 #define ts printf("*****\n"); 14 const int MAXN=100005; 15 int b[MAXN],d[MAXN],p[MAXN]; 16 int n,m,tt; 17 struct node 18 { 19 int d,p; 20 }a[MAXN]; 21 bool cmp1(node a,node b) 22 { 23 return a.d>b.d; 24 } 25 struct cmp 26 { 27 bool operator()(int x,int y) 28 { 29 return x>y; 30 } 31 }; 32 priority_queue<int,vector<int>,cmp > q; 33 bool vis[MAXN]; 34 int main() 35 { 36 int i,j,k; 37 #ifndef ONLINE_JUDGE 38 freopen("1.in","r",stdin); 39 #endif 40 while(scanf("%d%d",&n,&m)!=EOF) 41 { 42 while(!q.empty()) q.pop(); 43 for(i=0;i<n;i++) scanf("%d",&b[i]); 44 for(i=0;i<m;i++) scanf("%d",&a[i].d); 45 for(i=0;i<m;i++) scanf("%d",&a[i].p); 46 sort(b,b+n); 47 sort(a,a+m,cmp1); 48 long long ans=0; 49 bool f=1; 50 int t=0; 51 for(i=n-1;i>=0;i--) 52 { 53 while(t<=m-1&&a[t].d>=b[i]) 54 { 55 q.push(a[t].p); 56 t++; 57 } 58 if(q.empty()) 59 { 60 f=0; 61 break; 62 } 63 ans+=q.top(); 64 q.pop(); 65 } 66 if(!f) printf("No\n"); 67 else printf("%I64d\n",ans); 68 } 69 }