湫湫系列故事——消灭兔子
生活随笔
收集整理的這篇文章主要介紹了
湫湫系列故事——消灭兔子
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
湫湫減肥
越減越肥!
最近,減肥失敗的湫湫為發泄心中郁悶,在玩一個消滅免子的游戲。
游戲規則很簡單,用箭殺死免子即可。
箭是一種消耗品,已知有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 1Sample Output
6 4題意:用更少的Q幣吧所有的兔子都殺死。
思路:最大的兔子先殺死,選傷害足夠花費最小的箭,依次類推,這樣就是一個最優解。(自己可以證明)
?
#include<iostream> #include<algorithm> #include<queue> #include<cstdio> using namespace std; const int max_n=100005; int n,m,b[max_n],d[max_n],p[max_n]; long long int sumCost; struct Node{int hurt;int cost;bool operator<(Node b)const{return cost>b.cost;} }arrow[max_n],nowNode; bool cmp(Node a,Node b) {return a.hurt>b.hurt; } int main() {while(scanf("%d%d",&n,&m)!=EOF){priority_queue<Node>q;sumCost=0;for(int i=0;i<n;i++){scanf("%d",&b[i]);}for(int i=0;i<m;i++){scanf("%d",&d[i]);}for(int i=0;i<m;i++){scanf("%d",&p[i]);}sort(b,b+n,greater<int>()); //按血量從大到小排序 for(int i=0;i<m;i++){arrow[i].hurt=d[i];arrow[i].cost=p[i];}sort(arrow,arrow+m,cmp); //按箭的傷害從大到小排序 bool flag=true;int right=0;for(int i=0;i<n;i++){while(right<m&&arrow[right].hurt>=b[i]){q.push(arrow[right]);right++;}if(q.empty()){cout<<"No"<<endl;flag=false;break;}nowNode=q.top();q.pop();sumCost+=nowNode.cost;} if(flag)printf("%lld\n",sumCost);}return 0; }?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的湫湫系列故事——消灭兔子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看病要排队
- 下一篇: matlab手写遗传算法解决一元函数最值