1. 程式人生 > >2017ecjtu-summer training # 9 HDU 4544

2017ecjtu-summer training # 9 HDU 4544

end sam 計算 log 每次 () 大於等於 降序排序 operator

湫湫系列故事——消滅兔子

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 2992 Accepted Submission(s): 987


Problem 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 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 題意 中文題很好懂 解析 很簡單 很容易想到 每次選d [ i ]>=b [ i ]且p [ i ]最小的那個箭,p [ i ]加到sum中,暴力搜肯定會超時,所以用到了優先隊列 AC代碼
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include 
<iostream> #include <sstream> #include <queue> #include <vector> #include <algorithm> #define maxn 100050 using namespace std; typedef long long ll; int n,m; int b[maxn]; struct node { int d; int p; } n1,n2; struct cmp { bool operator()(node n1,node n2) { return n1.p > n2.p; } }; bool cmp1(node a,node b) { return a.d>b.d; //按d降序排序 } bool cmp2(int a,int b) { return a>b; //b降序排序 } struct node jian[maxn]; int main() { while(scanf("%d%d",&n,&m)!=EOF) { priority_queue<node,vector<node>,cmp> q; //以node為元素,以p為小頂堆優先隊列 int i,j; for(i=0; i<n; i++) { scanf("%d",&b[i]); } for(i=0; i<m; i++) { scanf("%d",&jian[i].d); } for(i=0; i<m; i++) { scanf("%d",&jian[i].p); } sort(b,b+n,cmp2); sort(jian,jian+m,cmp1); int flag=1; ll sum=0; int k=0; for(i=0; i<n; i++) { while(k < m&&jian[k].d>=b[i]) //把大於等於b[i]的箭壓進隊列 { q.push(jian[k]); k++; } if(q.empty()) { flag=0; break; } else { sum+=q.top().p; q.pop(); //刪除隊頂元素 } } if(flag) cout<<sum<<endl; else cout<<"No"<<endl; } } /* 另外一種定義結構體優先隊列代碼 struct node { int d; int p; friend bool operator<(node n1,node n2) { return n1.p > n2.p; } }; 調用語句 priority_queue<node> q; */

2017ecjtu-summer training # 9 HDU 4544