zoukankan      html  css  js  c++  java
  • IOI 2011 Rice Hub 米仓

    题目

    分析

    首先来观察一下这题的数据范围,Subtask 4当中的数据量10^15大到惊人的程度。很显然这是我们所不能够处理的数据量。但转而看R的大小,就令人能够接受了,那么不难想到,这里有一个离散化的思路。

    然后我们考虑如何安排这个米仓。这个米仓其实就相当于一个“中位数”,也就是安排在米仓能够处理的区间的正当中。

    这里出现了一个“区间”的概念,那么我们就可以想到用一个类似二分的思想来枚举区间的左右边界。

    首先O(R)枚举左边界,然后嵌一个while查右边界,写一个check函数来检查这个区间的可行性。check当中其实就是利用一个前缀和来计算钱数,然后和预算比较,返回true or false。

    卡点

    这里遇到的一个小卡点就是数据类型。一开始都开了int类型,但是再想想我们之前看到的10^15的惊人数据量,开long long就是必须的事情了。

    程序

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int MAXN = 100000 + 10;
     4 long long S[MAXN], R, x[MAXN], r, b, ans, t;
     5 bool check(int Left, int Right)
     6 {
     7     int hub_pos = (Left + Right) >> 1;
     8     long long Cost=1ll*x[hub_pos]*(hub_pos-Left+1)-S[hub_pos]+S[Left-1]+S[Right]-S[hub_pos]-1ll*x[hub_pos]*(Right-hub_pos);
     9     if (Cost <= b)
    10         return true;
    11     return false;
    12 }
    13 int main()
    14 {
    15     freopen("ricehub.in","r",stdin);
    16     freopen("ricehub.out","w",stdout);
    17     cin >> r >> t >> b;
    18     for (int i = 1; i <= r; i++)
    19     {
    20         cin >> x[i];
    21         S[i] = S[i-1] + x[i];
    22     }
    23     R = 1;
    24     for (int L = 1; L <= r; L++)
    25     {
    26         while (R <= r && check(L,R))
    27             R++;
    28         ans = max(ans, R-L);
    29     }
    30     cout << ans << endl;
    31     return 0;
    32 }
  • 相关阅读:
    maven 依赖阿里云仓库
    jacob
    mysql
    简单明了区分escape、encodeURI和encodeURIComponent(转载)
    eclipse
    StringBuffer的构造方法和capacity的返回值关系
    toString和valueOf的区别
    js中ajax返回数据
    springmvc 文件上传
    springmvc 上传文件报错 String不能转成multipartFile
  • 原文地址:https://www.cnblogs.com/OIerPrime/p/9061925.html
Copyright © 2011-2022 走看看