Saving HDU
阿新 • • 發佈:2018-11-09
話說上回講到海東集團面臨內外交困,公司的元老也只剩下XHD夫婦二人了。顯然,作為多年拼搏的商人,XHD不會坐以待斃的。
一天,當他正在苦思冥想解困良策的時候,突然想到了自己的傳家寶,那是公司成立的時候,父親作為賀禮送來的一個錦囊,徐父當時交代,不到萬不得已的時候,不要開啟它。“現在不正是最需要的時候嗎?”,一邊想,XHD一邊找到了這個精心保管的錦囊,開啟一看,裡面只有一句話“杭城北麓千人洞有寶”。
二話不說,XHD拿起一個大口袋就出發了,這個千人洞他是知道的,小的時候,爸爸曾經帶他來過這個隱蔽的路口,並告訴他,這是千人洞。他現在才明白爸爸當初這句話的含義。
儘管有點印象,XHD還是花了很大的精力才找到這個異常隱蔽的洞口,走進一看,幾乎驚呆了,真的是眼花繚亂!不過儘管寶貝的種類不少,但是每種寶貝的量並不多,當然,每種寶貝單位體積的價格也不一樣,為了挽救HDU,現在請你幫忙儘快計算出來XHD最多能帶回多少價值的寶貝?(假設寶貝可以分割,分割後的價值和對應的體積成正比)
Input
輸入包含多個測試例項,每個例項的第一行是兩個整數v和n(v,n<100),分別表示口袋的容量和寶貝的種類,接著的n行每行包含2個整數pi和mi(0<pi,mi<10),分別表示某種寶貝的單價和對應的體積,v為0的時候結束輸入。
Output
對於每個測試例項,請輸出XHD最多能取回多少價值的寶貝,每個例項的輸出佔一行。
Sample Input
2 2 3 1 2 3 0
Sample Output
5 經過錦囊相助,HDU會脫離危機嗎? 欲知後事如何,且聽下回分解——
C++版本一
手動排序
#include <iostream> #include <stdio.h> #include <cstring> #include <algorithm> #include <queue> using namespace std; int n,v; int a[110][2]; int main() { while(true){ scanf("%d",&v); if(v==0) break; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d%d",&a[i][0],&a[i][1]); } int k; for(int i=0;i<n;i++){ k=i; for(int j=i+1;j<n;j++){ if(a[k][0]<a[j][0]) k=j; } if(k!=i){ int temp; temp=a[k][0]; a[k][0]=a[i][0]; a[i][0]=temp; temp=a[k][1]; a[k][1]=a[i][1]; a[i][1]=temp; } } int ans=0; int t=v; for(int i=0;i<n;i++){ if(t<=0) break; if(t>=a[i][1]){ ans+=a[i][1]*a[i][0]; t=t-a[i][1]; } else{ ans=ans+t*a[i][0]; break; } } printf("%d\n",ans); } //cout << "Hello world!" << endl; return 0; }
C++版本二
sort排序
#include<cmath> #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<stack> #include<queue> #include<algorithm> using namespace std; struct Trs { int p; int m; }trs[110]; bool cmp(Trs a,Trs b) { return a.p>b.p; } int main() { int v,n,j,sum,w; while(~scanf("%d",&v),v) { scanf("%d",&n); int i,k=0; sum=0; for(i=0;i<n;i++) scanf("%d%d",&trs[i].p,&trs[i].m); sort(trs,trs+n,cmp); for(i=0;i<n;i++) { for(j=0;j<trs[i].m;j++) { sum+=trs[i].p; k++; if(k==v) break; } if(k==v) break; } printf("%d\n",sum); } return 0; }
C++版本三
優先佇列
貪心演算法
#include<stdio.h>
#include<math.h>
#include <queue>
#include<algorithm>
#include <iostream>
#include <string.h>
using namespace std;
struct node
{
int pi,mi;
bool operator <(const node a)const
{
return pi<a.pi;//表明優先順序高的在最頂端top
}
};
int main()
{
int v;
while(~scanf("%d",&v)&&v)
{
priority_queue <node ,vector<node>,less<node> >q;
int n;
scanf("%d",&n);
while(n--)
{
int pi,mi;
node no;
scanf("%d%d",&pi,&mi);
no.pi=pi;no.mi=mi;
q.push(no);
}
int ans=0;
while(!q.empty()&&v)
{
if(q.top().mi<=v)
{
ans+=q.top().mi*q.top().pi;
v-=q.top().mi;
node no;
no=q.top();
q.pop();
}
else
{
ans+=v*q.top().pi;
v=0;
}
}
printf("%d\n",ans);
}
return 0;
}