首先我们来简单看一下这道题的statement

Problem Statement

    

Note that in the following problem statement, all quotes and angle brackets are for clarity

A certain vending machine delves out its goods from a rotating cylinder, which can rotate around in both clockwise and counter-clockwise directions. The cylinder has a number of shelves on it, and each shelf is divided into a number of columns. On the front of the machine, there is a panel of doors that extends the entire height of the column. There is one door for each shelf, which is the width of one column. When a purchase is made, the user uses two buttons to rotate the cylinder so their purchase is located at a door. They make their purchase by sliding the appropriate door open, and removing the item (there can only be one item per column on a particular shelf). The cylinder can rotate in a complete circle, and so there are always two ways to get from a particular column to another column.

Because the vending machine company wants to sell the most expensive items possible, and the machine can only show one column at a time, the machine will always try to put forth the most expensive column available. The price of a column is calculated by adding up all the prices of the remaining items in that column. The most expensive column is defined to be the one with the maximum price. If 5 minutes have elapsed since the last purchase was made, the machine rotates the cylinder to the most expensive column. If, however, another purchase has been made before the 5 minutes are up, the rotation does not occur, and the 5 minute timer is reset.

Recently, some machines' rotating motors have been failing early, and the company wants to see if it is because the machines rotate to show their expensive column too often. To determine this, they have hired you to simulate purchases and see how long the motor is running.

You will be given the prices of all the items in the vending machine in a vector <string>. Each element of prices will be a single-space separated list of integers, which are the prices (in cents) of the items. The Nth integer in the Mth element of prices represents the price of the Nth column in the Mth shelf in the cylinder. You will also be given a vector <string> purchases. Each element in purchases will be in the format: "<shelf>,<column>:<time>" <shelf> is a 0-based integer which identifies the shelf that the item was purchased from. <column> is a 0-based integer which identifies the column the item was purchased from. <time> is an integer which represents the time, in minutes, since the machine was turned on.

In the simulation, the motor needs to run for 1 second in order to rotate to an adjacent column. When the machine is turned on, column 0 is facing out, and it immediately rotates to the most expensive column, even if the first purchase is at time 0. The machine also rotates to the most expensive column at the end of the simulation, after the last purchase. Note that when an item is purchased, its price is no longer used in calculating the price of the column it is in. When the machine rotates to the most expensive column, or when a user rotates the cylinder, the rotation is in the direction which takes the least amount of time. For example, in a 4-column cylinder, if column 0 is displayed, and the cylinder is rotated to column 3, it can be rotated backwards, which takes 1 second, versus rotating forwards which takes 3 seconds.

If a user tries to purchase an item that was already purchased, this is an incorrect simulation, and your method should return -1. Otherwise, your method should return how long the motor was running, in seconds.

Definition

    
Class: VendingMachine
Method: motorUse
Parameters: vector <string>, vector <string>
Returns: int
Method signature:                int motorUse(vector <string> prices, vector <string> purchases)               
(be sure your method is public)

Limits

    
Time limit (s): 2.000
Memory limit (MB):                64

Notes

- When rotating to the most expensive column, if two columns have the same price, rotate to the one with the lowest column number (see example 0).
- If two purchases are less than 5 minutes apart, the machine does not perform a rotation to the most expensive column between the purchases. If two purchases are 5 or more minutes apart, the machine rotates to the most expensive column between the two purchases.

Constraints

- prices will have between 1 and 50 elements, inclusive.
- Each element of prices will have between 5 and 50 characters, is a single-space separated list of integers, and has no leading or trailing spaces.
- Each element of prices will have the same number of integers in it.
- Each element of prices will have at least 3 integers in it.
- Each integer in prices will be between 1 and 10000, inclusive, and will not contain leading 0's.
- purchases will have between 1 and 50 elements, inclusive.
- Each element of purchases will be in the format "<shelf>,<column>:<time>" (angle brackets and quotes are for clarity only), where <shelf>, <column>, and <time> are all integers.
- In each element of purchases, <shelf> will be between 0 and M - 1, inclusive, where M is the number of elements in prices.
- In each element of purchases, <column> will be between 0 and N - 1, inclusive, where N is the number of integers in each element of prices.
- In each element of purchases, <time> will be between 0 and 1000, inclusive.
- In each element of purchases, <shelf>, <column>, and <time> will not contain extra leading 0's.
- purchases will be sorted in strictly ascending order by <time>. This means that each purchase must occur later than all previous ones.

Examples

0)  
    
{"100 100 100"}
{"0,0:0", "0,2:5", "0,1:10"}
Returns: 4

The vending machine has three columns, and only one row. Since all three items are the same price, they are all the most expensive, and therefore, the lowest numbered column is rotated to. Since the machine starts out at column 0, no rotation is performed before the first purchase. The starting configuration is (*'s denote the currently displayed column):

+-----+-----+-----+
| 100 | 100 | 100 |
+*****+-----+-----+

In the first purchase, the customer does not rotate the cylinder because the item he wants is already displayed. The configuration of the vending machine is now:

+-----+-----+-----+
| 0 | 100 | 100 |
+*****+-----+-----+

Since the next purchase is at least 5 minutes away, the machine performs a rotation to the most expensive column. Both column 1 and 2 are now 100 apiece, so it rotates to the smallest index of these, column 1. The fastest way there is to rotate forward 1 column, yielding 1 second of motor use:

+-----+-----+-----+
| 0 | 100 | 100 |
+-----+*****+-----+

The next customer purchases the item in column 2, which is 1 column away, so add 1 second to the motor use. Because another 5 minutes passes, the most expensive column is displayed, which is now column 1. Add 1 more second for the rotation. The configuration is now:

+-----+-----+-----+
| 0 | 100 | 0 |
+-----+*****+-----+

The final customer purchases from column 1, (which is already displayed), and the final most expensive column is rotated to. Since all columns are the same price again (0), column 0 is displayed. It takes 1 second to get back there, so add 1 more second.

1)  
    
{"100 200 300 400 500 600"}
{"0,2:0", "0,3:5", "0,1:10", "0,4:15"}
Returns: 17

The most expensive column during this whole example is column 5. Since all purchases are at least 5 minutes apart, the most expensive column is rotated to each time.

Before the purchases start, add 1 second for rotating to column 5. The first purchase is 3 columns away, so add 3 seconds to get there, and 3 seconds to get back to column 5 The second purchase is 2 columns away, so add 4 seconds to get there and back. The third purchase is also 2 columns away, so add 4 more seconds. The final purchase is only one column away, so add 2 more seconds.

The final configuration is:

+-----+-----+-----+-----+-----+-----+
| 100 | 0 | 0 | 0 | 0 | 600 |
+-----+-----+-----+-----+-----+*****+
2)  
    
{"100 200 300 400 500 600"}
{"0,2:0", "0,3:4", "0,1:8", "0,4:12"}
Returns: 11

This is the same as example 1, except now, the purchases are all less than 5 minutes apart.

3)  
    
{"100 100 100"}
{"0,0:10", "0,0:11"}
Returns: -1

The second purchase is illegal since the item was already purchased

4)  
    
{"100 200 300",
"600 500 400"}
{"0,0:0", "1,1:10", "1,2:20",
"0,1:21", "1,0:22", "0,2:35"}
Returns: 6

A two-row example. The configurations just before each purchase are:

purchase 1:
+-----+-----+-----+
| 100 | 200 | 300 |
+-----+-----+-----+
| 600 | 500 | 400 |
+*****+-----+-----+ purchase 2:
+-----+-----+-----+
| 0 | 200 | 300 |
+-----+-----+-----+
| 600 | 500 | 400 |
+-----+*****+-----+ purchase 3:
+-----+-----+-----+
| 0 | 200 | 300 |
+-----+-----+-----+
| 600 | 0 | 400 |
+-----+-----+*****+ purchase 4:
+-----+-----+-----+
| 0 | 200 | 300 |
+-----+-----+-----+
| 600 | 0 | 0 |
+-----+-----+*****+ purchase 5:
+-----+-----+-----+
| 0 | 0 | 300 |
+-----+-----+-----+
| 600 | 0 | 0 |
+-----+*****+-----+ purchase 6:
+-----+-----+-----+
| 0 | 0 | 300 |
+-----+-----+-----+
| 0 | 0 | 0 |
+-----+-----+*****+ final:
+-----+-----+-----+
| 0 | 0 | 0 |
+-----+-----+-----+
| 0 | 0 | 0 |
+*****+-----+-----+

TopCoder的题目往往有这样一种规律,就是陈述的长度越长那么这道题的难度往往也会下降

没有考什么独特新颖的算法,这道题的精髓就在于熟练操作字符串和逻辑思路严密与否

下面这张图片是我手写的流程框体(用office体现太麻烦了)

1)整个算法的主要程序步为

  1.计算每一列的商品之和并返回最大的一列

  2.计算从当前位置到最大一列的最短路径

  3.将购买的代价(权)迭加且同时判断边界问题和题目要求的不重叠问题

2)另一个比较重要的问题是在于字符串的操作上,根据SRM的规则灵活运用格式化字符串转换和c++里的stringstream类会极大的提升程序运行以及Coding的速度效率

3)代码如下在3月22日下午AC

 #include<iostream>
#include<cstdlib>
#include<vector>
#include<string>
#include<cstdio>
#include<cmath>
#include<sstream> using namespace std; class VendingMachine{
public: int maxColumn(vector<vector<int>> p){
int maxVal=;
int maxCol=;
//////////////If the maximun sum is the same
//////////////The function will return the minimized colomn index
for(int i=;i<p[].size();i++){
int tmp=;
for(int j=;j<p.size();j++){
tmp+=p[j][i];
}
if(maxVal<tmp){
maxVal=tmp;
maxCol=i;
}
}
return maxCol;
} int minMove(int start,int end,int len){
if(start<len&&end<len){
return abs(end-start)<(len-abs(end-start))?abs(end-start):(len-abs(end-start));
}else return -;
} vector<vector<int>> transform(vector<string> pr){
vector<vector<int>> tmp;
for(int i=;i<pr.size();i++){
vector<int> v;
istringstream iss(pr[i]);
int iX;
while(iss>>iX){
v.push_back(iX);
}
tmp.push_back(v);
}
return tmp;
} int motorUse(vector<string> prices,vector<string> purchases){
int iTotal=;
int iMax=;
int iNow=;
int iClock=;
vector<vector<int>> p;
p=transform(prices);
int iLen=p[].size();
//////Initialize The Cost
iMax=maxColumn(p);
iTotal+=minMove(iNow,iMax,iLen);
iNow=iMax;
//////Loops Begin
for(int i=;i<purchases.size();i++){
int s,c,t;
sscanf(purchases[i].c_str(),"%d,%d:%d",&s,&c,&t);
if(!p[s][c])return -;
if((t-iClock)>=){
////////Adjusting
iMax=maxColumn(p);
iTotal+=minMove(iNow,iMax,iLen);
iNow=iMax;
}
iTotal+=minMove(iNow,c,iLen);
iNow=c;
p[s][c]=;
//////Ending of a loop
iClock+=t;
}
iMax=maxColumn(p);
iTotal+=minMove(iNow,iMax,iLen);
return iTotal;
} };

TopCoder<SRM>上的一道1100分的题目解析附代码的更多相关文章

  1. TopCoder SRM 560 Div 1 - Problem 1000 BoundedOptimization & Codeforces 839 E

    传送门:https://284914869.github.io/AEoj/560.html 题目简述: 定义"项"为两个不同变量相乘. 求一个由多个不同"项"相 ...

  2. TopCoder SRM 667 Div.2题解

    概览: T1 枚举 T2 状压DP T3 DP TopCoder SRM 667 Div.2 T1 解题思路 由于数据范围很小,所以直接枚举所有点,判断是否可行.时间复杂度O(δX × δY),空间复 ...

  3. 求拓扑排序的数量,例题 topcoder srm 654 div2 500

    周赛时遇到的一道比较有意思的题目: Problem Statement      There are N rooms in Maki's new house. The rooms are number ...

  4. TopCoder SRM 625 Incrementing Sequence 题解

    本题就是给出一个数k和一个数组,包含N个元素,通过每次添加�数组中的一个数的操作,最后须要得到1 - N的一个序列,不用排序. 能够从暴力法入手,然后优化. 这里利用hash表进行优化,终于得到时间效 ...

  5. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  6. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  7. 一道简单的动态规划题目——House Robber

    一.题目 House Robber(一道Leetcode上的关于动态规划的简单题目)具体描述如下: There is a professional robber planning to rob hou ...

  8. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置

    前言 有朋友问了我关于博客系统搭建相关的问题,由于是做开发相关的工作,我给他推荐的是使用github的gh-pages服务搭建个人博客. 推荐理由: 免费:github提供gh-pages服务是免费的 ...

  9. Mac上使用Visual Studio Code开发/调试.NET Core代码

    Mac上使用Visual Studio Code开发/调试.NET Core代码 .Net Core 1.0终于发布了,Core的一大卖点就是跨平台.这个跨平台不只是跨平台运行,而且可以跨平台开发.今 ...

随机推荐

  1. 查看Linux上MySQL版本信息

    如果MySQL是用rpm或者yum安装的,可用 #rpm -qa|grep mysql查看. 如: [root@asd76 ~]# rpm -qa|grep mysqlmysql-5.1.73-3.e ...

  2. vue2.0 仿手机新闻站(四)axios

    1.axios的配置 main.js import Vue from 'vue' import App from './App.vue' // 引入 路由 import VueRouter from ...

  3. Android中Java与web通信

    Android中Java与web通信不是新的技术了,在android公布之初就支持这样的方式,2011年開始流行,而这样的模式开发也称作Hybird模式. 这里对android中的Java与web通信 ...

  4. 【C语言学习】封装和模块化思想

    刚学习完C后,做的关于C的课程设计是在一个源文件里放了几百行代码,并且各个功能之间都是相互依赖的,这样就会非常麻烦. 由于当我要改动某个地方的时候,就会牵连着要改动喝多的地方.而在实际的程序设计中.这 ...

  5. c# 推荐5款超实用的.NET性能分析工具

    虽然.NET框架号称永远不会发生内存泄漏,原因是引入了内存回收机制.但在实际应用中,往往我们分配了对象但没有释放指向该对象的引用,导致对象永远无法释放.最常见的情况就是给对象添加了事件处理函数,但当不 ...

  6. [魅族Degao]Androidclient性能优化

    本文由魅族科技有限公司资深Android开发project师degao(嵌入式企鹅圈原创团队成员)撰写,是degao在嵌入式企鹅圈发表的第一篇原创文章,毫无保留地总结分享其在领导魅族多个项目开发中的A ...

  7. JQuery EasyUI DataGrid动态合并单元格

    /**        * EasyUI DataGrid根据字段动态合并单元格        * @param fldList 要合并table的id        * @param fldList ...

  8. cookie-小总结吧

    写入common.js文件,其他页面调用即可: //添加cookie值 function addcookie(name, value, days) { days = days || 0; var ex ...

  9. URL Handle in Swift (一) -- URL 分解

    更新时间: 2018-6-6 在程序开发过程之中, 我们总是希望模块化处理某一类相似的事情. 在 ezbuy 开发中, 我接触到了对于 URL 处理的优秀的代码, 学习.改进.记录下来.希望对你有所帮 ...

  10. Canvas中图片翻转的应用

    很多时候拿到的素材都是单方向的,需要将其手动翻转来达到需求,比如下面这张图片: 它是朝右边方向的,但还需要一张朝左边方向的,于是不得不打开PS将其翻转然后做成雪碧图.如果只是一张图片还好说,但通常情况 ...