HDU6024 Building Shops

xiaoxiao2021-02-28  84

Building Shops

                                                            Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)                                                                                                   Total Submission(s): 13    Accepted Submission(s): 7 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 candy 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   Source 2017中国大学生程序设计竞赛 - 女生专场 ————————————————————————————————

题意:给出n个地点的位置坐标xi和花费ci,对于每一个位置可以选择在花费ci建店或者花费左边离他最近的已建的位置的距离差,求最小花费

解题思路:dp,第一个点必建, dp[i][0]表示在该点不建,第一个点到第i个点的最小花费和,dp[i][1]表示该点建,第一个点到第i个点的最小花费和

#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <map> #include <cmath> #include <set> #include <stack> #include <queue> #include <vector> #include <bitset> #include <functional> using namespace std; #define LL long long const int INF=0x3f3f3f3f; int n; struct node { LL x,c; } p[10004]; LL dp[10004][2]; bool cmp(node a,node b) { return a.x<b.x; } int main() { while(~scanf("%d",&n)) { memset(dp,INF,sizeof dp); memset(p,0,sizeof p); for(int i=0; i<n; i++) scanf("%lld%lld",&p[i].x,&p[i].c); sort(p,p+n,cmp); dp[0][1]=p[0].c; for(int i=1; i<n; i++) { dp[i][1]=min(dp[i-1][0],dp[i-1][1])+p[i].c; LL dis=0; for(int j=i-1; j>=0; j--) { dis+=(p[j+1].x-p[j].x)*(i-j); dp[i][0]=min(dp[i][0],dp[j][1]+dis); } } printf("%lld\n",min(dp[n-1][0],dp[n-1][1])); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-82839.html

最新回复(0)