贪心+等价转化 HDU 1489

等价转换,题意简单来讲如下:在一条直线均匀分布N个村庄,每个村庄要么买酒,要么卖酒,且村庄的买酒和卖酒供需平衡,总和为0,把k个单位的酒从一个村庄运到相邻的村庄需要k个单位的劳动力,输出最小的劳动力。

贪心,从最左边的村庄考虑,如果需要买酒,则一定有劳动力从村庄2及以后的村庄运到村庄1,这样问题就可以等价于只有村庄2—N,且第二个村庄的需求为a1+a2。另外如果是卖酒,同样是要运到村庄2号或后面的村庄,所以这里的话,还要注意贪心方式,每次进行交易的话,一定是和其最近的村庄进行交易是最优的,试想如果不按照此种方式进行,值不一定最优,例如: 1 -6 6 2 3 -6 如果硬要将-6和6进行交易实质上-6的劳动力消耗和将-6分解为把1个分给村庄1和把5个分给村庄3是一样的,但是前一个的村庄1要消耗更多的劳动力(因为它的那一份在最后),所以此题贪心的要求就是最近最优。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 int main(){
 7     long long n,i,num,s,pre;
 8     while(cin>>n && n!= 0){
 9         s = 0;
10         pre = 0;
11         for(i = 1;i<= n ;i++){
12             cin>>num;
13             s += abs(pre);
14             pre += num;
15         }
16         cout<<s<<endl;
17     }
18     return 0;
19 }

 

posted @ 2015-08-18 23:07  fancy_boy  阅读(229)  评论(0编辑  收藏  举报