• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
HaibaraAi
博客园    首页    新随笔    联系   管理    订阅  订阅

练习赛 上课 动态规划

上课

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单元能量.



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

Output

对于每一个测试实例,输出上完C门课程所需要的最小能量。每个测试实例一行输出。

样例说明:
先去地点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

hnust_loser
 
//用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 

 

posted @ 2013-09-25 18:48  HaibaraAi  阅读(122)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3