zoukankan      html  css  js  c++  java
  • FZU2168——防守阵地 I——————【找规律或前缀和】

    防守阵地 I
    Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    Description

    部队中共有N个士兵,每个士兵有各自的能力指数Xi,在一次演练中,指挥部确定了M个需要防守的地点,按重要程度从低到高排序,依次以数字1到M标注每个地点的重要程度,指挥部将选择M个士兵依次进入指定地点进行防守任务,能力指数为X的士兵防守重要程度为Y的地点将得到X*Y的参考指数。现在士兵们排成一排,请你选择出连续的M个士兵依次参加防守,使得总的参考指数值最大。

    Input

    输入包含多组数据。

    输入第一行有两个整数N,M(1<=N<=1000000,1<=M<=1000),第二行N个整数表示每个士兵对应的能力指数Xi(1<=Xi<=1000)。

    对于30%的数据1<=M<=N<=1000。

    Output

    输出一个整数,为最大的参考指数总和。

    Sample Input

    5 3 2 1 3 1 4

    Sample Output

     17

    解题思路:方法1>通过求解两次前缀和,然后遍历求出最大值

       

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 using namespace std;
     5 const int maxn=1000100;
     6 #define  ll long long
     7 ll x[maxn];
     8 ll a[maxn];
     9 ll sum[maxn];
    10 int main(){
    11 
    12     int n,m;
    13     while(scanf("%d%d",&n,&m)!=EOF){
    14 
    15         for(int i=1;i<=n;i++){
    16 
    17             scanf("%d",&x[i]);
    18         }
    19         for(int i=n;i>=0;i--){
    20 
    21             a[n-i+1]=x[i]+a[n-i];
    22         }
    23         for(int i=1;i<=n;i++){
    24 
    25             sum[i]=a[i]+sum[i-1];
    26         }
    27         ll ans=0;
    28         for(int i=m;i<=n;i++){
    29 
    30             ans=max(sum[i]-sum[i-m]-m*a[i-m],ans);
    31         }
    32         printf("%lld
    ",ans);
    33     }
    34 
    35 }

     方法2>求一次前缀和,然后求出m个元素的和,找规律发现,a+2b+3c..mx-(a+b+c...+x)+my=b+2c+3d...my。

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    const int maxn=1000100;
    int a[maxn],sum[maxn],sam[maxn];
    int main(){
    
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF){
    
            for(int i=1;i<=n;i++){
    
                scanf("%d",&a[i]);
            }
            for(int i=1;i<=n;i++)
                sam[i]=sam[i-1]+a[i];
            for(int i=1;i<=n-m+1;i++){
    
                sum[i]=sam[i+m-1]-sam[i-1];
            }
    
            int ans=0,tmp=0;
            for(int i=1;i<=m;i++)
                tmp+=a[i]*i;
    
            for(int i=2;i<=n-m+1;i++){
    
                ans=max(ans,tmp-sum[i-1]+m*a[i+m-1]);
                tmp=tmp-sum[i-1]+m*a[i+m-1];
            }
           printf("%d
    ",ans);
        }
        return 0;
    }
    

      

    学学学 练练练 刷刷刷
  • 相关阅读:
    ACM/ICPC 之 中国剩余定理+容斥原理(HDU5768)
    ACM/ICPC 之 三维计算几何+暴力枚举+判重(HDU5839)
    ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)
    ACM/ICPC 之 Dinic+枚举最小割点集(可做模板)(POJ1815)
    ACM/ICPC 之 DP解有规律的最短路问题(POJ3377)
    ACM/ICPC 之 DFS+SPFA-贪心+最短路(POJ2679)
    ACM/ICPC 之 靠墙走-DFS+BFS(POJ3083)
    maven的setting.xml配置文件详解(中文)
    高性能、高可用的分布式架构体系(有启发的)
    各种数据库再spring中的配置(转载)
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4331872.html
Copyright © 2011-2022 走看看