贪心+等价转化 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 }