题目描述
大豪哥有个好朋友叫王胖子,众所周知王胖子特别爱吃零食,比如各种不一样的糖果,辣条呀,可是王胖子每个月用在买零食上的钱不是固定的,但是因为王胖子特别爱吃零食,他希望把自己能花在买吃的钱全部用掉,来换得最多的零食
输入
先输入王胖子有n块钱可以用来买吃的,商场里有m件零食(0<=n,m<=1000)
接下来有m行,每行包括这件零食的单价(元/kg),以及商场有多少kg这种商品
所有输入数据都在int型范围内
输出
输出王胖子最多可以有多少零食(保存4位小数)
样例输入
100 4
10 9
5 4
8 5
20 50
样例输出
13.0000
题解:贪心,每次拿最便宜的
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <vector> 6 #include <cstdlib> 7 #include <iomanip> 8 #include <cmath> 9 #include <ctime> 10 #include <map> 11 #include <set> 12 using namespace std; 13 #define lowbit(x) (x&(-x)) 14 #define max(x,y) (x>y?x:y) 15 #define min(x,y) (x<y?x:y) 16 #define MAX 100000000000000000 17 #define MOD 1000000007 18 #define pi acos(-1.0) 19 #define ei exp(1) 20 #define PI 3.141592653589793238462 21 #define INF 0x3f3f3f3f3f 22 #define mem(a) (memset(a,0,sizeof(a))) 23 typedef long long ll; 24 ll gcd(ll a,ll b){ 25 return b?gcd(b,a%b):a; 26 } 27 bool cmp(int x,int y) 28 { 29 return x>y; 30 } 31 const int N=1005; 32 const int mod=1e9+7; 33 struct node 34 { 35 int x, y; 36 }a[N]; 37 bool cmp1(node b1,node b2) 38 { 39 return b1.x<b2.x; 40 } 41 int main() 42 { 43 std::ios::sync_with_stdio(false); 44 int n,m; 45 while(cin>>n>>m){ 46 for(int i=0;i<m;i++){ 47 cin>>a[i].x>>a[i].y; 48 } 49 sort(a,a+m,cmp1); 50 float s=0; 51 for(int i=0;i<m;i++){ 52 if(n>=(a[i].x)*(a[i].y)){ 53 s+=a[i].y; 54 n-=(a[i].x)*(a[i].y); 55 } 56 else { 57 s+=(float)n/a[i].x; 58 n=0; 59 } 60 if(n==0) break; 61 } 62 printf("%.4f ",s); 63 } 64 return 0; 65 }