sgu 148 分类: sgu 2015-03-11 13:14 49人阅读 评论(0) 收藏
假设每一层的水都是本质不同的,
如果存在一种最优方案从第i层开始减压,那么第i层的水一定要流到第n层
可以用反证法证明:
若存在一种最优方案第
而是在第
那么修改这个方案,从第
代价更小,而最后的效果相同,
所以这不是最优方案,推出矛盾,原结论成立。
于是可以枚举
时间复杂度
可以有优化
如果从第
即
当对第i层减压时
因为
而注意到第
所以
所以可以有这样一个算法:
1,处理
2,处理
从
3,枚举减压起始层,计算代价,求出最优方案
时间复杂度
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<utility>
using namespace std;
const int MAXN = 15005 , INF = (1<<30) - 1;
int n;
struct station{int w,l,p;}b[MAXN] = {0};
priority_queue<pair<int,int> > heap;
int pre[MAXN] = {0};
int ans , st , cost;
int main()
{
#ifndef ONLINE_JUDGE
freopen("sgu148.in","r",stdin);
freopen("sgu148.out","w",stdout);
#endif
scanf("%d",&n);
for(int i = 1; i <= n ;i++)
{
scanf("%d%d%d",&b[i].w,&b[i].l,&b[i].p);
pre[i] = pre[i-1] + b[i].w;
}
// sum(j , i) > L(i) pre[i] - pre[j-1] > L[i]
// pre[j-1] < pre[i] - L[i]
cost = 0 , st = 0 ,ans = INF;
for(int i = n; i >= 1;i--)
{
for(;!heap.empty() && heap.top().first > pre[i-1];heap.pop())
cost -= heap.top().second;
heap.push(make_pair(pre[i] - b[i].l , b[i].p));
cost += b[i].p;
if(cost < ans)
{
ans = cost;
st = i;
}
}
for(int i = st , sumf = 0; i <= n; i++)
{
sumf += b[i].w;
if(sumf <= b[i].l)
printf("%d\n",i);
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
}
版权声明:本文为博主原创文章,未经博主允许不得转载。