zoukankan      html  css  js  c++  java
  • bzoj2059[Usaco2010 Nov]Buying Feed 购买饲料*

    bzoj2059[Usaco2010 Nov]Buying Feed 购买饲料

    题意:

    约翰开车来到镇上,他要带K吨饲料回家。如果他的车上有X吨饲料,每公里就要花费X^2元,开车D公里就需要D* X^2元。约翰可以从N家商店购买饲料,所有商店都在一个坐标轴上,第i家店的位置是Xi,饲料的售价为每吨Ci元,库存为Fi。n≤500,k≤10000。

    题解:

    dp。f[i][j]表示在第i个地方,有j吨饲料:f[i][j]=f[i-1][k]+C[i-1]*(j-k)+j*(X[i]-x[i-1]),j-k≤F[i-1]。化简得f[i][j]=f[i-1][k]-C[i-1]*k+C[i-1]*j+j*(X[i]-x[i-1]),即对每个j找到最小的f[i-1][k]-C[i-1]*k,且满足j-k≤F[i-1],故可以用优先队列优化,使复杂度降低为O(nk)。

    代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <queue>
     5 #define inc(i,j,k) for(int i=j;i<=k;i++)
     6 #define maxn 10010
     7 #define ll long long
     8 #define INF 1e16
     9 using namespace std;
    10 
    11 inline int read(){
    12     char ch=getchar(); int f=1,x=0;
    13     while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    14     while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    15     return f*x;
    16 }
    17 long long f[2][maxn]; int n,k,e,x,y,r;
    18 struct nd{ll x,f,c;}nds[maxn]; bool cmp(nd a,nd b){return a.x<b.x;}
    19 struct ddq{
    20     deque<pair<ll,int> >dq;
    21     void insert(ll x,int y){
    22         while(!dq.empty()&&dq.back().first>=x)dq.pop_back(); dq.push_back(make_pair(x,y));
    23     }
    24     void erase(int y){
    25         while(!dq.empty()&&dq.front().second<=y)dq.pop_front();
    26     }
    27 }ddq;
    28 int main(){
    29     k=read(); e=read(); n=read(); x=0; y=1; inc(i,1,n){nds[i].x=read(); nds[i].f=read(); nds[i].c=read();}
    30     nds[++n]=(nd){e,0,0}; sort(nds+1,nds+n+1,cmp); inc(i,1,k)f[x][i]=INF; f[x][0]=0;
    31     inc(i,2,n){
    32         ddq.dq.clear(); r=0;
    33         inc(j,0,k){
    34             while(r<=j)ddq.insert(f[x][r]-r*nds[i-1].c,r),r++; ddq.erase(j-nds[i-1].f-1);
    35             if(ddq.dq.empty())f[y][j]=INF;
    36             else f[y][j]=ddq.dq.front().first+j*nds[i-1].c+j*j*(nds[i].x-nds[i-1].x);
    37         }
    38         swap(x,y);
    39     }
    40     printf("%lld",f[x][k]); return 0;
    41 }

    20161017

  • 相关阅读:
    不务正业系列-浅谈《过气堡垒》,一个RTS玩家的视角
    [LeetCode] 54. Spiral Matrix
    [LeetCode] 40. Combination Sum II
    138. Copy List with Random Pointer
    310. Minimum Height Trees
    4. Median of Two Sorted Arrays
    153. Find Minimum in Rotated Sorted Array
    33. Search in Rotated Sorted Array
    35. Search Insert Position
    278. First Bad Version
  • 原文地址:https://www.cnblogs.com/YuanZiming/p/5981993.html
Copyright © 2011-2022 走看看