• 2017中国大学生程序设计竞赛


    Building Shops

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
    Total Submission(s): 0    Accepted Submission(s): 0


    Problem Description
    HDU’s n classrooms are on a line ,which can be considered as a number line. Each classroom has a coordinate. Now Little Q wants to build several candy shops in these n classrooms.

    The total cost consists of two parts. Building a candy shop at classroom i would have some cost ci . For every classroom P without any   shop, then the distance between P and the rightmost classroom with a candy shop on P 's left side would be included in the cost too. Obviously, if there is a classroom without any candy shop, there must be a candy shop on its left side.

    Now Little Q wants to know how to build the candy shops with the minimal cost. Please write a program to help him.
     
    Input
    The input contains several test cases, no more than 10 test cases.
    In each test case, the first line contains an integer n(1n3000) , denoting the number of the classrooms.
    In the following n lines, each line contains two integers xi,ci(109xi,ci109) , denoting the coordinate of the i -th classroom and the cost of building a candy shop in it.
    There are no two classrooms having same coordinate.
     
    Output
    For each test case, print a single line containing an integer, denoting the minimal cost.
     
    Sample Input
    3
    1 2
    2 3
    3 4
    4
    1 7
    3 1
    5 10
    6 1
     
    Sample Output
    5
    11
     
    题意:给你n个教室的坐标和 当前教室建造糖果商店的代价  若当前教室不建造糖果商店则代价为 与左边最近的糖果商店的距离 第一个位置上的教室必然建造糖果商店 问最少的代价。
    题解:dp[i][1]表示第i个教室建造糖果商店 前i个教室的最小代价,dp[i][2]表示第i个教室不建造糖果商店 前i个教室的最小代价,具体看代码。HDU 注意while多组输入 orz。
     
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 #define esp 0.00000000001
     5 struct node
     6 {
     7     ll x;
     8     ll c;
     9 } N[3005];
    10 bool cmp(struct node a,struct node b)
    11 {
    12     return a.x<b.x;
    13 }
    14 ll dp[3005][5];
    15 ll sum[3005];
    16 int main()
    17 {
    18     int n;
    19     while(scanf("%d",&n)!=EOF)
    20     {
    21         for(int i=1; i<=n; i++)
    22             scanf("%I64d %I64d",&N[i].x,&N[i].c);
    23         sort(N+1,N+1+n,cmp);
    24         for(int i=1; i<=n; i++)
    25         {
    26             dp[i][1]=5e18;
    27             dp[i][2]=5e18;
    28         }
    29         dp[0][1]=0;
    30         dp[0][2]=0;
    31         for(int i=1; i<=n; i++)
    32         {
    33             dp[i][1]=min(dp[i-1][1],dp[i-1][2])+N[i].c;
    34             ll exm=0;
    35             for(int j=i-1; j>=1; j--)
    36             {
    37                 exm=exm+(i-j)*(N[j+1].x-N[j].x);//累加距离
    38                 dp[i][2]=min(dp[i][2],dp[j][1]+exm);
    39             }
    40         }
    41         printf("%I64d
    ",min(dp[n][1],dp[n][2]));
    42     }
    43     return 0;
    44 }
  • 相关阅读:
    证明三个简单数学问题~(≧▽≦)/~啦啦啦
    计算时间复杂度
    字符三角形(循环做法)
    luogu Peter的烟
    c++一本通1000
    luogu最长连号
    luogu子数整数
    luogu三角函数
    (因更改文件夹造成)anaconda prompt 提示系统找不到指定的路径
    echarts之树形图改变节点之间连线颜色以及结点的颜色
  • 原文地址:https://www.cnblogs.com/hsd-/p/6821352.html
Copyright © 2020-2023  润新知