码迷,mamicode.com
首页 > 其他好文 > 详细

URAL 1031 Railway Tickets

时间:2015-08-06 11:14:39      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

动态规划。

一道完全自己想然后看了眼别人给的样例测试了一下程序的题。。。。。。

题的意思就是有许多站台,给出的距离是距离第一个的,然后一个长度一个价钱,问从一个站台到另一个站台需要的最小费用

动态规划嘛。。。

写的是n^2的,,应该有n的。。。。注意给的起点终点的大小关系!!!

#include<stdio.h>记得开LONG LONG
#include<string.h>
#include <algorithm>
#include <bits/stdc++.h>

using namespace std;
long long int a[10001];
long long int dp[10001]={0};
int main()
{
    long long int l1,l2,l3,c1,c2,c3;
    scanf("%lld%lld%lld%lld%lld%lld",&l1,&l2,&l3,&c1,&c2,&c3);
    int num;
    scanf("%d",&num);
    int qi,zhong;
    scanf("%d %d",&qi,&zhong);
    if(qi>zhong) swap(qi,zhong);
    int i,j;
    for(i=2;i<=num;i++) scanf("%lld",&a[i]);
    for(i=qi;i<=zhong;i++)
    {
        long long int t=a[i]-a[i-1];
        if(t<=l1) dp[i]=dp[i-1]+c1;
        if(t>l1&&t<=l2) dp[i]=dp[i-1]+c2;
        else dp[i]=dp[i-1]+c3;
    }
    dp[qi]=0;
    for(i=qi;i<=zhong;i++)
    {
        for(j=1;j<=i-1;j++)
        {
            //if(j<qi) break;
            int juli=a[i]-a[j];
            if(juli<=l3)
            {
                if(juli<=l2)
                {
                    if(juli<=l1) {dp[i]=min(dp[j]+c1,dp[i]); }
                    else dp[i]=min(dp[i],dp[j]+c2);
                }
                else dp[i]=min(dp[i],dp[j]+c3);
            }
        }
    }
    //for(i=1;i<=zhong;i++) printf("%d ",dp[i]);
    printf("%lld\n",dp[zhong]);
    return 0;
}


再给一个大神写的吧。。。。。。。15ms...

#include <stdio.h>
long w[10000]={0},f[100000]={0};
int main()
{
      long i,s,t,n,l1,l2,l3,c1,c2,c3,s1,s2,s3;
      int min(int,int);
      scanf("%ld %ld %ld %ld %ld %ld*",&l1,&l2,&l3,&c1,&c2,&c3);
      scanf("%ld*",&n);
      scanf("%ld %ld*",&s,&t);
      if (s>t) s=s+t,t=s-t,s=s-t;
      for (i=2;i<=n;i++)
        scanf("%d*",&w[i]);
      s1=s,s2=s,s3=s;
      for (i=s+1;i<=t;i++)
        {
                        while (w[i]-w[s1]>l1) s1++;
                        while (w[i]-w[s2]>l2) s2++;
                        while (w[i]-w[s3]>l3) s3++;
                        if(s1<i)
                          f[i]=min(min(f[s1]+c1,f[s2]+c2),f[s3]+c3);
                        else
                          if (s2<i) f[i]=min(f[s2]+c2,f[s3]+c3);
                          else
                            f[i]=f[s3]+c3;
                        }
      printf("%ld",f[t]);
      return 0;
}
int min(int s1,int s2)
{
    if (s1<s2) return s1;
    else return s2;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

URAL 1031 Railway Tickets

标签:

原文地址:http://blog.csdn.net/zhangwenchi/article/details/47312193

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!