CodeForces 354A - Vasya and Robot (简略思维)

CodeForces 354A - Vasya and Robot (简单思维)

题意:

有一个机器人   他有两只手,一只左手一只右手,他面前摆了一排东西,左手只能从最左边拿,右手只能从最右边拿,每个东西有一个重量w[i]  ,   左手拿起这样东西需要消耗

w[i] * l  的能量, 右手拿起这样东西需要消耗w[i] * r 的能量,如果连续使用左手或者右手还需要多消耗 Q1或者Q2的能量,问拿走所有东西所需要消耗的最少能量是多少? 

题解:

最后的状态无非就是左边一节为左手拿的,右边一节为右手拿的, 我们只需要枚举分界点,然后看左边右边差了多少个物品就可以知道多少次过载的使用左手或者右手

代码:

#include<stdio.h>
#include<string.h>
__int64 value1[100005], value2[100005], w[100005];
int minn(int a, int b)
{
    if(a < b)  return a;
    return b;
}
int main()
{


       int n, l, r, q1, q2;
       while(scanf("%d", &n) != EOF)
       {
           scanf("%d %d %d %d", &l, &r, &q1, &q2);
           memset(value1, 0, sizeof(value1));
           memset(value2, 0, sizeof(value2));
           for(int i = 1; i <= n; i++)
           scanf("%I64d", &w[i]);
           __int64 sum1 = w[1]*l, sum2 = w[n]*r, Min = 1 << 30;
           value1[1] = sum1, value2[1] = sum2;
           for(int i = 2; i <= n; i++)
           {
               sum1 += ((w[i] * l));
               sum2 += ((w[n - i + 1] * r));
               value1[i] = sum1;
               value2[i] = sum2;
           }
           for(int i = 0; i <= n; i++)
           {
               int p = minn(i, n - i);
               __int64 k = value2[p] +  value1[p];
               if(i > n - i)
               k += l * w[n - i + 1], k += (value1[i] - value1[n-i+1]) + (2 * i - n - 1) * q1;
               else if(n-i > i)
               k += r * w[n - i], k += (value2[n-i] - value2[i+1]) + (n - 2 * i - 1) * q2;
               if(k < Min)   Min = k;
           }
           printf("%I64d\n", Min);
       }
}