您的位置:首页 > 其它

HDU 2111 Saving HDU

2016-07-27 19:21 393 查看
题目详见:点击打开链接

题目分析:

这是一道有关贪心算法的问题,因为一个物体的单价和体积是已知的,可以用结构体来存储一个物体的单价和体积,之后将读入的数据用单价按降序排列。然后遍历排序后的结构体得到临界时的积累的体积V , 因为物品是可分割的,故用只需加上最后一个物品拥有剩余体积的价值即可

AC代码如下:

#include <cstdlib>
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <functional>
#include <list>
#include <deque>
#include <fstream>
#include <iomanip>
#include <string>
#include <sstream>
#include <memory.h>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#define ll long long
using namespace std;
struct Save
{
int p; //price
int m; //volume
};
int main()
{
int v, n;
Save s[105];
while(cin >> v && v != 0)
{
memset(s, 0, sizeof(s));
cin >> n;
int money = 0 , sv = 0;
for(int i =0; i < n; i++)
{
cin >> s[i].p >> s[i].m ;
}
for(int i = 0; i < n-1; i++) //sort the s by price
for(int j = i+1; j < n; j++ )
if(s[i].p < s[j].p)
swap(s[i], s[j]);
int i;
for(i = 0; i < n; i++) //Get the i-th whole things.
{
sv += s[i].m;
if(sv > v) //如果累加的体积大于袋子的体积了,则跳出循环
break;
money += s[i].p * s[i].m;
}
money = money + (v - (sv - s[i].m) ) * s[i].p;
cout << money << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 贪心