采购单-京东2017在线笔试编程题C++
2016-09-06 10:41
316 查看
题目描述:
过年啦!小B高兴的不行了,她收到了很多红包,可以实现好多的愿望呢。小B可是对商店货架上心仪的货物红眼好久了,只因囊中羞涩作罢,这次她可是要大大的shopping一番。小B想去购物时,总是习惯性的把要买的东西列在一个购买清单上,每个物品单独列一行(即便要买多个某种物品),这次也不例外。
小B早早的来到了商店,由于她太激动,以至于她到达商店的时候,服务员还没有把各个商品的价签排好,所有的价签还都在柜台上。因此还需要一段时间,等服务器把价签放到对应的商品处,小B才能弄清她的购买清单所需的费用。
小B都有些迫不及待了,她希望你能够根据购买清单,帮她算算最好和最坏的情况下所需的费用,你能帮她吗?
输入
输入中有多组测试数据。每组测试数据的第一行为两个整数n和m(1=<n, m=<1000),分别表示价签的数量以及小B的购买清单中所列的物品数。第二行为空格分隔的n个正整数,表示货架上各类物品的价格,每个数的大小不超过100000。随后的m行为购买清单中物品的名称,所有物品名称为非空的不超过32个拉丁字母构成的字符串,保证清单中不同的物品种类数不超过n,且商店有小B想要购买的所有物品。
输出
对每组测试数据,在单独的行中输出两个数a和b,表示购买清单上所有的物品可能需要的最小和最大费用。
样例输入
5 3
4 2 1 10 5
apple
orange
mango
6 5
3 5 1 6 8 1
peach
grapefruit
banana
orange
orange
样例输出
7 19
11 30
代码如下:
过年啦!小B高兴的不行了,她收到了很多红包,可以实现好多的愿望呢。小B可是对商店货架上心仪的货物红眼好久了,只因囊中羞涩作罢,这次她可是要大大的shopping一番。小B想去购物时,总是习惯性的把要买的东西列在一个购买清单上,每个物品单独列一行(即便要买多个某种物品),这次也不例外。
小B早早的来到了商店,由于她太激动,以至于她到达商店的时候,服务员还没有把各个商品的价签排好,所有的价签还都在柜台上。因此还需要一段时间,等服务器把价签放到对应的商品处,小B才能弄清她的购买清单所需的费用。
小B都有些迫不及待了,她希望你能够根据购买清单,帮她算算最好和最坏的情况下所需的费用,你能帮她吗?
输入
输入中有多组测试数据。每组测试数据的第一行为两个整数n和m(1=<n, m=<1000),分别表示价签的数量以及小B的购买清单中所列的物品数。第二行为空格分隔的n个正整数,表示货架上各类物品的价格,每个数的大小不超过100000。随后的m行为购买清单中物品的名称,所有物品名称为非空的不超过32个拉丁字母构成的字符串,保证清单中不同的物品种类数不超过n,且商店有小B想要购买的所有物品。
输出
对每组测试数据,在单独的行中输出两个数a和b,表示购买清单上所有的物品可能需要的最小和最大费用。
样例输入
5 3
4 2 1 10 5
apple
orange
mango
6 5
3 5 1 6 8 1
peach
grapefruit
banana
orange
orange
样例输出
7 19
11 30
代码如下:
#include<iostream> #include<string> #include<vector> #define N 100 using namespace std; //定义一个结构体用来保存商品名及购买次数 typedef struct commodity{ string name; int count; }; int main() { int n,m; int max ,min ; int k=0; while(scanf("%d %d", &n, &m) != EOF) { int *value=new int[n+1];//价格 for(int i=1;i<=n;i++) cin>>value[i]; vector<commodity> com; string name; bool tag=false; for(int i=0;i<m;i++) { cin>>name;//商品名 tag=false; int j; for(j=0;j<com.size();j++) if(com[j].name==name) { tag=true; break; } if(tag) com[j].count++;//重复的商品名,增加次数 else { commodity tmp; tmp.name=name; tmp.count=1; com.push_back(tmp); } } //按清单上商品出现的次数从下到大进行排序 for(int i=1;i<com.size();i++) { commodity tmp=com[i]; int j; for(j=i-1;j>=0&&tmp.count<com[j].count;j--) com[j+1]=com[j]; if(j<0) com[0]=tmp; else com[j+1]=tmp; } //对商品价格进行排序 for(int i=2;i<=n;i++) { value[0]=value[i]; int j; for(j=i-1;j>=0&&value[0]<value[j];j--) value[j+1]=value[j]; value[j+1]=value[0]; } min[k]=0;max[k]=0; int t=1; //计算最小费用 for(int i=com.size()-1;i>=0;i--) { min[k]+=value[t]*com[i].count; t++; } t=n; //计算最大费用 for(int i=com.size()-1;i>=0;i--) { max[k]+=value[t]*com[i].count; t--; } delete[] value; com.clear(); k++; } for(int i=0;i<k;i++) cout<<min[i]<<" "<<max[i]<<endl; return 0; }
相关文章推荐
- 京东2017实习生招聘在线笔试编程题题解
- 幸运数-京东2017在线笔试编程题
- 京东2017实习生招聘在线笔试编程题
- 京东2017实习生招聘——在线笔试编程题总结
- 2017京东在线笔试编程题之 买东西
- 京东2017实习生招聘在线笔试编程题
- 京东2017实习生笔试编程题-终结者C
- CVTE c/c++软件类在线笔试 编程题
- 京东2017校招笔试编程题iOS开发工程师
- 京东笔试编程题:进制均值(C++)
- 阿里巴巴2017校招C++岗位在线编程题-RNA嵌套
- 京东2017校招笔试编程题2:进制转换、辗转相除法
- 2017网易内推c++工程师笔试——编程题
- 阿里巴巴2017校招C++岗位在线编程题-求集合D的最大值,最小值和元素个数三者之和
- 2017校园招聘腾讯笔试题 在线编程题
- 京东2016校园实习生招聘系统测试岗在线笔试编程题
- 2017京东校招笔试编程题:进制转换、辗转相除
- 去哪儿网2017校招在线笔试(前端工程师)编程题及JavaScript代码
- 阿里笔试题(2017在线编程题)-- 数串分组
- 京东2015在线笔试----编程题--分苹果