牛客网校招风暴周-运石头

来源:互联网 发布:sql关联查询性能 编辑:程序博客网 时间:2024/05/18 01:53

题目要求:

给定车子每次运送物体的最大质量,现将一堆石头从起点运到目的地,使得车子运送的趟数最少。输入数据第一行是车子的容量,第二行是石头的数量,第三行是每个石头的重量,例如:

10(车子单趟最大载重量)

9(石头数量)

1 3 5 7 9 10 8 6 4(每个石头的重量)

5

10 10 10 10 10

输出:

6

5

题目分析:

我们先将这些石头的重量全部相加,就像示例sum{1 3 5 7 9 10 8 6 4}=53,每趟车子最大的载重量为10个单位,那么车子运送趟数t[(sum/load),N]之间,其中load为车子的最大载重量,sum为所有需要运送石头的重量之和,N为需要运送的石头的个数,(sum/load)表示将它们的商向上取整。对于每次运送,我们采用贪心策略,每次选取和当前可容纳质量最相近且不超过当前可容纳质量的石头装入。

代码:

#include<iostream>#include<vector>#include<list>#include<fstream>#include<string>#include<set>#include<map>#include<algorithm>using namespace std;class solution{public:int min_load_time(vector<int>&load, vector<bool>&flag,int capacity){vector<vector<int>>total;vector<int>single;total.clear();single.clear();int size = load.size();int now = capacity,mark;count = 0;number = size;while (number){int min = INT_MAX;mark = -1;for (int i = 0; i < size; i++){if (flag[i] == false && load[i] <= now && now - load[i]<min){min = now - load[i];mark = i;}}if (mark == -1){//没有可装入车子的石头count++; //增加一趟车子now = capacity;total.push_back(single);single.clear();continue;}else{flag[mark] = true;now = now - load[mark];number--;single.push_back(load[mark]);if (now == 0||number==0){count++;now = capacity;total.push_back(single);single.clear();}}}return count;}int count;int number;};int main(){int num,temp,capacity;vector<int>load;vector<bool>flag;solution aa;int sum;aa.count = 0;cout << "capacity:";cin >> capacity;cout << "number of stones:";cin >> num;while (num>=0){if (num <= 1){cout <<(num>0?1:0)<< endl;continue;}load.clear();flag.clear();sum = 0;for (int i = 0; i < num; i++){cin >> temp;sum += temp;load.push_back(temp);flag.push_back(false);}cout << "total weight of the stones is :"<<sum<< endl;cout << "load time is :"<<aa.min_load_time(load,flag,capacity) << endl;cout << "capacity:";cin >> capacity;cout << "number of stones:";cin >> num;}return 0;}

测试结果:



目前想到的最好的解决方法为贪心算法,可能还有其他比较好的算法(持续更新中),欢迎讨论!!!!!!

0 0