您的位置:首页 > 移动开发 > IOS开发

机器人问题(icpc)还有问题,调试中

2014-12-14 18:35 190 查看

**********************************************题目要求****************************************

Paul有n个重物堆在一条线上。该重物由1连续编号到n,

最左边的物品编号为1,最右边的物品编号为n。已知每个物品的重量

,第i个物品的重量为Wi公斤。Paul需要收集所有重物,但是他很懒。

因此他打算用他全新的机器人。该机器人有两个不同的手臂 - 左手和右手,

可以连续执行以下操作:

用左手拿最左边的重物,花费Wi•l能量单位(Wi是最左边的物品的重量,

l是某一参数)。如果与之前的动作是一样的(上一次用左手)

,机器人须额外花费Ql的能量单位;

用右手拿最右边的重物,花费Wj•r能量单位

(Wj是最右边的物品的重量,r是某一参数)。

如果与之前的动作是一样的(上一次用右手),

机器人须额外花费Qr的能量单位;

Paul想让机器人花费尽可能少的能量来帮他完成任务。

他想让你来解决这个问题。你的任务是求解机器人收集所有重物可花费的最低能量值。

**********************************解题思路*******************************************************

/*初步考虑本题目应该会涉及到有关于图的问题,考虑用dijistra的问题,构建以机器人的图,然后统计最短路径

因此将会用的工具是邻接矩阵,参考使用STL的map来构建

/********************************运行要求********************************************************

【输入】

第一行是一个数T,代表有T组输入样例

每个输入样例样例有两行:第一行是五个变量n, l, r, Ql, Qr

(1 ≤ n ≤ 105; 1 ≤ l, r ≤ 100; 1 ≤ Ql, Qr ≤ 104);第二行是n个重物的重量w1,w2….wn (1 ≤ wi ≤ 100)。

【输出】

每个样例只有1个数,代表机器人最小消耗的能量

【输入样例】

2

3 4 4 19 1

42 3 99

4 7 2 3 9

1 2 3 4

*****************************************主程序****************************************************/

#include<iostream> 

using namespace std;

#define max 20

class weight//构建重物属性的类

{

public:

 int w[max];//重物的质量

 int No[max];//重物的号码

 int area;//重物所在位置

};

class Paul

{

public:

     int roboto;//机器人的位置

  int n;//重物的个数

  int l, r, Ql, Qr;//l参数,r参数,左边运动能量,右边运动能量

  weight Num;

     Paul input();

 };

Paul Paul::input()

{

 Paul paul;

 cin >>paul.n>>paul.l >> paul.r >> paul.Ql >>paul.Qr;//依次输入个数,l参数,r参数,向左运动能量,右能量

 return paul;

}

void main()

{

 int T;//检验数据的行数

 Paul paul;

 int tempNo = 0;//保存位置暂时信息

 int tempQr=0,tempQl=0,tempQ = 0;//保存能量暂时信息

 cin >> T;

 for (int i = 0; i < T; i++)//执行两次操作

 {

  paul = paul.input();//录入所要处理的值

  for (int j = 0; j < paul.n; j++)//录取质量

  {

   paul.Num.No[j+1] = j + 1;//第几个重物

   cin >> paul.Num.w[j+1];//读入重物质量

  }

  /***********穷举法,将机器人的位置一个一个设置,初始设定为第一个,计算总的能量为Q=l*wi+r*wi(重复运动时候左加Ql右加Qr*/

  paul.roboto = 0;

  for (paul.roboto; paul.roboto < paul.n+1; paul.roboto++)

  {

   

   tempNo = paul.n - paul.roboto;

   for (int k = 1; k < tempNo + 1; k++)

   {

    if (paul.roboto + k < tempNo + 1){

     tempQr = tempQr + paul.Num.w[paul.roboto + k] * paul.r;

     if (paul.roboto - k>1)

      tempQl = tempQl + paul.Num.w[paul.roboto - k] * paul.l;

    }

   }

/******************************程序运行结果为702,初步考虑应该是多运算了一次,加入判定区***************************/

   int tempCompare = tempNo - paul.roboto * 2;

   if (tempCompare>0)

    tempQ = tempQl + tempQr + paul.Qr*tempCompare;

   else tempQ = tempQl + tempQr + paul.Ql*(-tempCompare);

   }

  cout << tempQ;

  }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iostream namespace