现在的位置: 首页 > 综合 > 正文

UVA – 662

2019年04月04日 ⁄ 综合 ⁄ 共 1300字 ⁄ 字号 评论关闭
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define INF 1000000000
const int maxn = 202;
const int maxk = 31;
int d[maxk][maxn],n,K,dist[maxn],sum[maxn][maxn];//到第i个已经选完前j个
bool vis[maxk][maxn];

int dp(int i,int j){
if(vis[i][j]) return d[i][j];
vis[i][j]=1;

if(i==K-1){
     return d[i][j]=sum[j+1][n];
}
for(int l=j+1;n-l>=K-i-1;l++){
     int num=dp(i+1,l)+sum[j+1][l];
     d[i][j]= (l==j+1 ? num:min(d[i][j],num));
}
return d[i][j];
}
void print_ans(int i,int j){
     if(i==K-1){
         if(j+1<n)  printf("Depot %d at restaurant %d serves restaurants %d to %d\n",i+1,((n+j+1)>>1),j+1,n);
         else       printf("Depot %d at restaurant %d serves restaurant %d\n",i+1,((n+j+1)>>1),j+1);
         return ;
     }
     for(int l=j+1;n-l>=K-i-1;l++){
        int num=d[i+1][l]+sum[j+1][l];
        if(d[i][j]==num){
             if(j+1<l) printf("Depot %d at restaurant %d serves restaurants %d to %d\n",i+1,((l+j+1)>>1),j+1,l);
             else      printf("Depot %d at restaurant %d serves restaurant %d\n",i+1,((l+j+1)>>1),j+1);
             print_ans(i+1,l);
             break;
        }
     }
}
int main()
{
    int kase=1;
    while(scanf("%d %d",&n,&K)==2){
         if(!n&&!K) break;
         for(int i=1;i<=n;i++) scanf("%d",&dist[i]);
         for(int i=1;i<=n;i++)
           for(int j=i;j<=n;j++){
            int zhong = (i+j)>>1;
            sum[i][j]=0;
            for(int k=i;k<=j;k++) sum[i][j]+=abs(dist[k]-dist[zhong]);
         }
         memset(vis,false,sizeof(vis));
         int Sum = dp(0,0);
         printf("Chain %d\n",kase++);
         print_ans(0,0);
         printf("Total distance sum = %d\n\n",Sum);
    }
}

抱歉!评论已关闭.