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;
}
题目分析:
这是一道有关贪心算法的问题,因为一个物体的单价和体积是已知的,可以用结构体来存储一个物体的单价和体积,之后将读入的数据用单价按降序排列。然后遍历排序后的结构体得到临界时的积累的体积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;
}
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法