poj 1018

来源:互联网 发布:海淘转运系统源码 编辑:程序博客网 时间:2024/05/29 04:27

没有进行剪枝直接跑的

练习一下C++的用法,看起来好像更麻烦了

vector<int> bandwidth 保存所有带宽,从小到大排序,然后逐个作为最小带宽进行枚举

每一种设备的信息存储在 info 里面,每一次枚举从每一组设备里面选一个


cin cout和printf还是不要混用的好。。。

#include <iostream>#include <vector>#include <map>#include <list>#include <set>#include <deque>#include <stack>#include <queue>#include <algorithm>#include <cmath>#include <cctype>#include <cstdio>#include <iomanip>#include <cmath>#include <cstdio>#include <iostream>#include <string>#include <sstream>#include <cstring>#include <queue>using namespace std;///宏定义const int INF = 20000000;const int MAXN = 500050;///全局变量 和 函数int t, n;struct dev{int bandwidth;int price;double bp;int mark;};bool cmp(dev d1, dev d2){return d1.bandwidth < d2.bandwidth;}vector< vector<dev> > info;vector<int> bandwidth;int main(){///变量定义int i, j, k;///操作执行cin >> t;while(t--){//dev selected;info.clear();bandwidth.clear();cin >> n;//输入n种设备vector<dev> tmpDev;for(i = 0; i < n; i++){//每种设备mi个供货商tmpDev.clear();int mi;cin >> mi;for(j = 0; j < mi; j++){dev tmp;cin >> tmp.bandwidth >> tmp.price;bandwidth.push_back(tmp.bandwidth);tmp.bp = tmp.bandwidth / tmp.price;tmpDev.push_back(tmp);}sort(tmpDev.begin(), tmpDev.end(), cmp);info.push_back(tmpDev);}sort(bandwidth.begin(), bandwidth.end());//进行枚举int sumResult = 0;int minBandResult = INF;double maxbp = 0;vector<int>::iterator pBand = bandwidth.begin();//把每一个带宽从小到大进行枚举while(pBand != bandwidth.end()){int tmpSum = 0;int minBand = (*pBand);double tmpBp;//对每一种设备进行选择vector< vector<dev> >::iterator pInfo = info.begin();for( ; pInfo != info.end(); pInfo++){vector<dev>::iterator pDev = (*pInfo).begin();//找出最小价格的设备int minPrice = INF;for( ; pDev != (*pInfo).end(); pDev++){if((*pDev).bandwidth >= minBand && (*pDev).price < minPrice)minPrice = (*pDev).price;}//加入到总价格当中tmpSum += minPrice;}//tmpBp = (double)minBand / (double)tmpSum;if(tmpBp > maxbp){maxbp = tmpBp;}//pBand++;}cout << setiosflags(ios::fixed) << setprecision(3) << maxbp <<endl;}  ///结束return 0;}


原创粉丝点击