題目大意:輸入金錢數、大米的種類、各種大米的單價和體積(總公斤數),輸出所能購買的大米的最大公斤數
解題思路:
1)先按單價排序。從小到大買。
2)這一道題與2111其實是差不多的。只不過前者是取價值最大的帶走,現在是取價值最小的帶走。
代碼如下:
/*
* 2187_1.cpp
*
* Created on: 2013年8月10日
* Author: Administrator
*/
#include <iostream>
using namespace std;
struct Node{
int price;
int quality;
};
bool compare(const Node& a , const Node& b){
return a.price < b.price;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int V , n;
scanf("%d%d",&V,&n);
Node ns[n];
int i;
for( i = 0 ; i < n ; ++i){
scanf("%d%d",&ns[i].price,&ns[i].quality);
}
sort(ns,ns+n,compare);
double sum = 0;
for(i = 0 ;i < n && V>0;++i){
if(((double)V)/ns[i].price > ns[i].quality){
V -= ns[i].quality*ns[i].price;
sum += ns[i].quality;
}else{
sum += (double)V/ns[i].price;
V= 0;
}
}
printf("%.2lf\n",sum);
}
}
/*
* 2187_1.cpp
*
* Created on: 2013年8月10日
* Author: Administrator
*/
#include <iostream>
using namespace std;
struct Node{
int price;
int quality;
};
bool compare(const Node& a , const Node& b){
return a.price < b.price;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int V , n;
scanf("%d%d",&V,&n);
Node ns[n];
int i;
for( i = 0 ; i < n ; ++i){
scanf("%d%d",&ns[i].price,&ns[i].quality);
}
sort(ns,ns+n,compare);
double sum = 0;
for(i = 0 ;i < n && V>0;++i){
if(((double)V)/ns[i].price > ns[i].quality){
V -= ns[i].quality*ns[i].price;
sum += ns[i].quality;
}else{
sum += (double)V/ns[i].price;
V= 0;
}
}
printf("%.2lf\n",sum);
}
}