zoukankan      html  css  js  c++  java
  • POJ 2018 Best Cow Fences

    Best Cow Fences
    Time Limit: 1000MS   Memory Limit: 30000K
    Total Submissions: 8772   Accepted: 2802

    Description

    Farmer John's farm consists of a long row of N (1 <= N <= 100,000)fields. Each field contains a certain number of cows, 1 <= ncows <= 2000. 

    FJ wants to build a fence around a contiguous group of these fields in order to maximize the average number of cows per field within that block. The block must contain at least F (1 <= F <= N) fields, where F given as input. 

    Calculate the fence placement that maximizes the average, given the constraint. 

    Input

    * Line 1: Two space-separated integers, N and F. 

    * Lines 2..N+1: Each line contains a single integer, the number of cows in a field. Line 2 gives the number of cows in field 1,line 3 gives the number in field 2, and so on. 

    Output

    * Line 1: A single integer that is 1000 times the maximal average.Do not perform rounding, just print the integer that is 1000*ncows/nfields. 

    Sample Input

    10 6
    6 
    4
    2
    10
    3
    8
    5
    9
    4
    1
    

    Sample Output

    6500
    题目大意:给你一个有n个数的序列,让你找到不小于f个数的序列中最大的平均值。
    解题方法:类似于最大连续子段和,如果前面子段的平均值小于紧接着后面长度不小于f的子段,则将前面的子段舍弃,否则将前面的子段保留。
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    using namespace std;
    
    int num[100020];
    int sum[100020];
    
    int main()
    {
        int n, f;
        int ans;
        while(scanf("%d%d", &n, &f) != EOF)
        {
            ans = -1;
            memset(sum, 0, sizeof(sum));
            for (int i = 0; i < n; i++)
            {
                scanf("%d", &num[i + 1]);
                sum[i + 1] = sum[i] + num[i + 1];
            }
            int i, j;
            for (i = 0, j = 0; i <= n - f; i++)
            {
                if (i > j && (sum[i] - sum[j]) * (i + f - j) < (sum[i + f] - sum[j]) * (i - j))
                {
                    j = i;//如果i和j之间的子段平均值小于i到i+f之间的平均值,则将舍弃i和j之间的子段

            }
    if (ans < 1000 * (sum[i + f] - sum[j]) / (i + f - j))
                {
                    ans = 1000 * (sum[i + f] - sum[j]) / (i + f - j);
                }
            }
            printf("%d
    ", ans);
        }
        return 0;
    }
     
  • 相关阅读:
    hadoop_05
    分布式集群时间同步
    crontab定时任务
    操作系统笔记五:输入输出系统
    操作系统笔记四:文件管理与磁盘存储器管理
    操作系统笔记三:存储器管理
    操作系统笔记二:进程与调度(2)
    操作系统笔记二:进程与调度(1)
    可能的加分项
    对老师的建议
  • 原文地址:https://www.cnblogs.com/lzmfywz/p/3228983.html
Copyright © 2011-2022 走看看