POJ 1160 Post Office

来源:互联网 发布:数据库设计原则是什么 编辑:程序博客网 时间:2024/06/11 10:23

在一条路上N个村庄中建立M个邮局,怎样建立邮局会使所有的村庄距离邮局的距离最短。


子问题:

S(K,Y) 在前K个村庄中建立Y个邮局

Source Code

Problem: 1160 User: jluliuxyMemory: 740K Time: 438MSLanguage: G++ Result: Accepted
  • Source Code
    //做完之后看看编程之美电梯问题#include <iostream>using namespace std;int ditok(int i,int k, int** arr){if( i >= k )return 0;int t = i + k;int flag = k-i+1;int index;int sum = 0;int start = k;if( flag%2 == 0 ){index = t/2;while( start != (index+1) ){sum += arr[0][start--];}sum += arr[0][index+1] - arr[0][index];start = i;while( start != index ){sum -= arr[0][start++];}}else{index = (t+1)/2;while( start != index ){sum += arr[0][start--];}start = i;while( start != index ){sum -= arr[0][start++];}}return sum;}int main(){int n,m;cin>>n>>m;int ** arr = new int*[m+1];int i,j,k;for( i = 0; i <= m; i++ )arr[i] = new int[n];for( i = 0; i < m+1; i++ )for( j = 0; j < n; j++ )arr[i][j] = 0;for( i = 0; i < n; i++ )cin>>arr[0][i];for( i = 1; i < m+1; i++ )arr[i][0] = 0;int min;int temp;/////////////////////////////////////*for( k = 0 ; k <= m; k++ ){for( i = 0 ; i < n; i++ )cout<<arr[k][i]<<" ";cout<<endl;}*//////////////////////////////////计算s(k,1)值for( k = 1; k < n-m+1; k++ ){min = ditok(0,k,arr);arr[1][k] = min;}int x;int ii;for( k = 1; k <= n; k++ ){for( x = 2; x <= m; x++ ){if( x == (k+1) ){arr[x][k] = 0;break;}min = 3000000;for( i = k-1; i > 0; i-- ){if( min < arr[x-1][i] )continue;temp = ditok(i+1,k,arr) ;//cout<<" k = "<<k<<" i = "<<i<<" temp =ditok "<<temp;temp += arr[x-1][i];min = min < temp ? min : temp ;//cout<<"// k = "<<k<<" i = "<<i<<" arr["<<(x-1)<<"]["<<i<<"]="<<arr[x-1][i]<<"  min= "<<min;}arr[x][k] = min;}}/*for( k = 0 ; k <= m; k++ ){for( i = 0 ; i < n; i++ )cout<<arr[k][i]<<" ";cout<<endl;}*/cout<<arr[m][n-1]<<endl;return 0;}

0 0
原创粉丝点击