练习赛 上课 动态规划
上课
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/65535K (Java/Other)
Total Submission(s) : 12 Accepted Submission(s) : 5
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
在大二时候,T个专业的C门课程都是一样的。为了鼓励学习兴趣,同一课程同时开课(也就是有T个教室同时上第一门课程),学生可以任选教室听课。为了保证这一点,所有教室同时上第一门课程,然后是同时第二们课程,....。
当然上课需要消耗能量,我们希望总能量最小。总能量包括上课本身需要的能量和各上课目的地之间移动需要的能量。 上第i门课程第j个专业课程所需能量为Eij。
上课教室位于0至L的直线上,第i门课程第j个专业课程的教室位置在 Pij. 假定上课从为位置0开始,依次上完C门课, 最后在位置L离开学校。移动距离d需要d单元能量.
当然上课需要消耗能量,我们希望总能量最小。总能量包括上课本身需要的能量和各上课目的地之间移动需要的能量。 上第i门课程第j个专业课程所需能量为Eij。
上课教室位于0至L的直线上,第i门课程第j个专业课程的教室位置在 Pij. 假定上课从为位置0开始,依次上完C门课, 最后在位置L离开学校。移动距离d需要d单元能量.
Input
第一行是不超过20的整数,表示测试实例的数目。
每个测试实例的第一行是三个空格分开整数C, T, L.随后有 C× T行,每行两个整数,表示某门课程的位置和上该课程所需要的能量, 最前面的T行表示第一门课,随后的T行表示第二门课,依次类推。同一门课的T个教室必然处于不同地点。
1 ≤ C ≤ 25
1 ≤ T ≤ 1000
1 ≤ L ≤ 1,000,000
1 ≤ Eij ≤ 1,000,000
0 ≤ Pij ≤ L
每个测试实例的第一行是三个空格分开整数C, T, L.随后有 C× T行,每行两个整数,表示某门课程的位置和上该课程所需要的能量, 最前面的T行表示第一门课,随后的T行表示第二门课,依次类推。同一门课的T个教室必然处于不同地点。
1 ≤ C ≤ 25
1 ≤ T ≤ 1000
1 ≤ L ≤ 1,000,000
1 ≤ Eij ≤ 1,000,000
0 ≤ Pij ≤ L
Output
对于每一个测试实例,输出上完C门课程所需要的最小能量。每个测试实例一行输出。
样例说明:
先去地点2,能量消耗3
再去地点4,能量消耗6
再去地点3,能量消耗9
最后在地点5离开学校,能量消耗11
样例说明:
先去地点2,能量消耗3
再去地点4,能量消耗6
再去地点3,能量消耗9
最后在地点5离开学校,能量消耗11
Sample Input
1 3 2 5 2 1 3 1 4 1 1 3 1 4 3 2
Sample Output
11
Author
//用64位因为如果有25个点在0,L循环时可能达到5e10
1 #include <map> 2 #include <set> 3 #include <stack> 4 #include <queue> 5 #include <cmath> 6 #include <vector> 7 #include <cstdio> 8 #include <cstring> 9 #include <algorithm> 10 using namespace std; 11 #define maxn 1005 12 #define mod 1000000007 13 #define INF 0x7fffffff 14 //#define ll long long 15 #define ll __int64 16 int p[26][maxn]; 17 int e[26][maxn]; 18 ll dp[26][maxn]; 19 int n,m,l; 20 int main(){ 21 int t; 22 scanf("%d",&t); 23 while(t--){ 24 ll s; 25 scanf("%d%d%d",&n,&m,&l); 26 for(int i=1;i<=n;i++) 27 for(int j=0;j<m;j++) 28 scanf("%d%d",&p[i][j],&e[i][j]); 29 for(int i=0;i<m;i++){p[0][i]=0;} 30 memset(dp,0,sizeof dp); 31 for(int i=1;i<=n;i++) 32 for(int j=0;j<m;j++){ 33 s=(ll)INF*1000; 34 for(int k=0;k<m;k++) 35 s=min(s,dp[i-1][k]+abs(p[i][j]-p[i-1][k])); 36 dp[i][j]=s+e[i][j]; 37 } 38 s=(ll)INF*1000; 39 for(int i=0;i<m;i++)s=min(s,dp[n][i]+l-p[n][i]); 40 printf("%I64d\n",s); 41 } 42 return 0; 43 }
View Code 2013-09-25 18:49:06
浙公网安备 33010602011771号