今年三月份的选拔赛的题目,也是我出的最后一题,当时很快就完成了,但是今天一做就是3小时了。贡献了wa不少
题意:一共有C种课程,每个课程都有T节课。C1,C2,C3..Cn的不同类的课连续上,而且同一种课的不同class是一个时间上的
问最后去到L点是最小消耗是多少
1.每移动到另外一个课室位置pos时,都消耗abs(位置差)的能量值,上每一节课就花费在当前点的能量值
2.绝对只能暴力,从数据上分析是不行的,25*1000*1000,超过理论限制,但是杭电数据水点。62水过就行。
3.今天是用一个位置数据记录状态转移的,每次都从上次状态转移到当前状态,并记录当前值。但是后来用一组数据测试wa掉了。
4.代码采用dp[][]方法记录当前状态的i,j,分别表示为第几节,第几个课室地点。上面的问题就没了。
附加测试数据,最后一组应该可以刷出不少问题来。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define maxn 1000010 int d[30][1010] , pos[30][1010] , eg[30][1010]; int C,T,L; #define inf 200000100 int nw,fm,fk,tmp,kx , kp; int main() { int Tx; int i,j,k,mink; scanf("%d",&Tx); while(Tx--) { memset(pos,0,sizeof(pos)); memset(eg,0,sizeof(eg)); scanf("%d %d %d",&C,&T,&L); for(i=1;i<=C;i++) //position { for(j=1;j<=T;j++) // energy { scanf("%d %d",&pos[i][j],&eg[i][j]); } } memset(d,0,sizeof(d)); for(i=1;i<=C;i++) { for(j=1;j<=T;j++) { tmp = inf; for(k=1;k<=T;k++) { //nw = pos[i][j];fm = pos[i-1][k]; d[i][j] = abs(pos[i-1][k]-pos[i][j]) + d[i-1][k] + eg[i][j]; if(d[i][j] < tmp) { tmp = d[i][j]; } } d[i][j] = tmp; } } mink = inf; for(i=1;i<=T;i++) { kx = d[C][i] + abs(pos[C][i]-L); if(kx < mink) mink = kx; } printf("%d ",mink); } return 0; } /* 10 3 2 5 2 1 3 1 4 1 1 3 1 4 3 2 3 2 7 2 2 4 3 5 6 4 5 2 4 3 8 7 4 6 30 6 3 7 8 2 15 10 1 9 2 3 17 30 30 27 10 10 40 23 30 11 46 1 12 1 7 30 1 25 14 3 10 11 8 10 2 13 4 15 9 11 3 23 7 13 4 1 10 ---------------------60! wa ------------------63! */
上着无聊的软件工程时,突然想到了今天为何wa得那么苦了,原来用d[1000000]表示每一个点的当前状态时,在发生转移的时候,数据变动会将原来的状态覆盖掉。好吧,样例万能,一开始就觉得如果用这种记录方法肯定死得很惨。mark一个先。