• 数学 之 Codeforces 354A


    //  [7/13/2014 Sjm]
    /*
    据题意知道:
    假设重物用左手拿,则该重物左边的所有重物都是用左手拿
    假设重物用右手拿,则该重物右边的所有重物都是用右手拿
     
    从左手出发:
    1)左手没拿重物
    2)左手拿1或2或...或n个重物
    故:枚举 (n+1) 种情况即可
     
    注意(详见代码):
    1)对一段区间内的重物重量之和的处理(O(1))。
    2)注意,假设左手共拿 m 个重物,右手共拿 n 个重物,只有当 abs(n-m) > 1 时,才会考虑额外费用,
    	否则通过交替拿左右边的重物,可不计额外费用。
    
    */
     1 #include <iostream>
     2 #include <cstdlib>
     3 #include <cstdio>
     4 using namespace std;
     5 const int MAX = 100005;
     6 
     7 int arr[MAX];
     8 
     9 int main()
    10 {
    11     int n, l, r, Ql, Qr;
    12     scanf("%d %d %d %d %d", &n, &l, &r, &Ql, &Qr);
    13     for (int i = 0; i < n; i++) {
    14         scanf("%d", &arr[i]);
    15         if (i != 0) {
    16             arr[i] += arr[i - 1];  // 为了方便计算一段区间内的重物重量之和
    17         }
    18     }
    19     int ans = arr[n - 1] * r + (n - 1)*Qr;  // 左手不拿重物的情况
    20     int tep;
    21     for (int i = 0; i < n; i++) { // 枚举左手拿重物的 n 种情况
    22         tep = arr[i] * l + (arr[n - 1] - arr[i])*r;
    23         
    24         int l_num = i + 1;
    25         int r_num = n - l_num;
    26         int Judge = r_num - l_num;
    27         
    28         if (abs(Judge) > 1)
    29         {
    30             if (Judge > 0) {
    31                 Judge--;
    32                 tep += (Judge * Qr);
    33             }
    34             if (Judge < 0){
    35                 Judge++;
    36                 tep += ((-Judge) * Ql);
    37             }
    38         }
    39         
    40         ans = (ans < tep) ? ans : tep;
    41     }
    42     printf("%d
    ", ans);
    43     return 0;
    44 }
  • 相关阅读:
    顺序表的扩容
    顺序表的插入
    顺序表的构造
    C# ContentType: "application/json" 请求方式传json
    顺序表构造,插入,扩容操作
    顺序表
    线性表
    算法
    数据结构的分类
    什么是数据结构
  • 原文地址:https://www.cnblogs.com/shijianming/p/4140833.html
Copyright © 2020-2023  润新知