題目大意:輸入金錢數、大米的種類、各種大米的單價和體積(總公斤數),輸出所能購買的大米的最大公斤數
解題思路:
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); } }