mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
Create 594_ka200812.cpp
From http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html
This commit is contained in:
parent
205aa6491f
commit
399b1b4526
62
CDOJ/594_ka200812.cpp
Normal file
62
CDOJ/594_ka200812.cpp
Normal file
|
@ -0,0 +1,62 @@
|
|||
#include<iostream>
|
||||
#include<string>
|
||||
#include<stdio.h>
|
||||
#include<memory.h>
|
||||
using namespace std;
|
||||
#define inf 0xfffffff
|
||||
#define min(a,b) a<b?a:b
|
||||
#define max(a,b) a>b?a:b
|
||||
|
||||
int dp[2][101];
|
||||
int n,c;
|
||||
int q[101];
|
||||
int head,tail,cur;
|
||||
|
||||
int main()
|
||||
{
|
||||
int i,j,x,nowf;
|
||||
//freopen("D:\\in.txt","r",stdin);
|
||||
while(scanf("%d%d",&n,&c)==2)
|
||||
{
|
||||
scanf("%d",&x);
|
||||
cur=0;
|
||||
for(i=0;i<x;i++)
|
||||
dp[cur][i]=inf;
|
||||
for(i=x;i<=100;i++)
|
||||
dp[cur][i]=(x-i)*(x-i);
|
||||
for(i=1;i<n;i++)
|
||||
{
|
||||
scanf("%d",&x);
|
||||
cur=1-cur;
|
||||
//比前一个人高
|
||||
head=tail=0;
|
||||
for(j=0;j<=100;j++) //当身高为j时候,队列里便已经保存了0~j-1的信息,注意,是第i-1个人的信息
|
||||
{
|
||||
nowf=dp[1-cur][j]-j*c;
|
||||
while(head<tail && q[tail-1]>nowf)
|
||||
tail--;
|
||||
q[tail++]=nowf;
|
||||
if(j<x)
|
||||
dp[cur][j]=inf;
|
||||
else
|
||||
dp[cur][j]=q[head]+j*c+(x-j)*(x-j);
|
||||
}
|
||||
//比前一个人矮
|
||||
head=tail=0;
|
||||
for(j=100;j>=0;j--) //当身高为j时候,队列里便已经保存了100~j+1的信息,正写反写是有技巧的
|
||||
{
|
||||
nowf=dp[1-cur][j]+j*c;
|
||||
while(head<tail && q[tail-1]>nowf)
|
||||
tail--;
|
||||
q[tail++]=nowf;
|
||||
if(j>=x)
|
||||
dp[cur][j]=min(dp[cur][j],q[head]-j*c+(x-j)*(x-j));
|
||||
}
|
||||
}
|
||||
int ans=inf;
|
||||
for(i=0;i<=100;i++)
|
||||
ans=min(ans,dp[cur][i]);
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user