南邮 OJ 1275 登山机器人问题

登山机器人问题

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 116            测试通过 : 21 

比赛描述

登山机器人是一个极富挑战性的高技术密集型科学研究项目,它为研究发展多智能体系统和多机器人之间的合作与对抗提供了生动的研究模型。登山机器人可以携带有限的能量。在登山过程中,登山机器人需要消耗一定能量,连续攀登的路程越长,其攀登的速度就越慢。在对种不同类型的机器人作性能测试时,测定出每个机器人连续攀登1米,2米,…,米,所用的时间。现在要对这n个机器人作综合性能测试,举行机器人接力攀登演习。攀登的总高度为米。规定每个机器人只能攀登1次,每次至少攀登米,最多攀登k米,而且每个机器人攀登的高度必须是整数,即只能在整米处接力。安排每个机器人攀登适当的高度,使完成接力攀登用的时间最短。

给定个登山机器人接力攀登的总高度m,及每个机器人连续攀登米,米,…,k米,所用的时间,编程计算最优攀登方案。



输入

第一行是正整数nkm分别表示机器人的个数,每个机器人最多可以攀登的高度,和攀登的总高度。接下来的n行中,每行有个正整数,分别表示机器人连续攀登1米,2米,…,米所用的时间。

输出

将计算出的最短攀登时间输出。

样例输入

5 10 25
24 49 75 102 130 160 192 230 270 320
23 48 75 103 139 181 224 274 344 415
22 49 80 180 280 380 480 580 680 780
25 51 80 120 170 220 270 320 370 420
23 49 79 118 158 200 250 300 350 400

样例输出

727

提示

undefined

题目来源

NUAA




/* WA3
#include<iostream>
int main(){
//	freopen("test.txt","r",stdin);
	int n,k,m,i,j,**a,**b,*index;
	scanf("%d%d%d",&n,&k,&m);
	a = (int **)malloc(n*sizeof(int*));
	b = (int **)malloc(n*sizeof(int*));
	index = (int *)malloc(n*sizeof(int));
	for(i=0;i<n;i++){
		a[i] = (int *)malloc(k*sizeof(int));
		b[i] = (int *)malloc(k*sizeof(int));
		index[i] = 0;
	}
	for(i=0;i<n;i++){
		for(j=0;j<k;j++){
			scanf("%d",&a[i][j]);
			if(j==0){
				b[i][j] = a[i][j];
			}else{
				b[i][j] = a[i][j] - a[i][j-1];
			}
//			printf("%4d",b[i][j]);
		}
//		printf("\n");
	}
	int minIndex;					//记录下一步耗时最少的机器人编号
	for(i=0;i<m;i++){
		minIndex=0;
		while(index[minIndex]>=k){
			minIndex++;				//第一个可用的机器人编号
		}
		for(j=minIndex+1; j<n; j++){
			if(index[j]<k && b[j][index[j]]<b[minIndex][index[minIndex]]){
				minIndex = j;
			}
		}
		index[minIndex]++;
	}
	int totalTime = 0;
	for(i=0;i<n;i++){
		if(index[i]){
			totalTime += a[i][index[i]-1];
		}
	}
	printf("%d\n",totalTime);
}
*/


/* AC 5MS
#include<iostream>
int main(){
//	freopen("test.txt","r",stdin);
	int n,k,m,i,j,**a,**b,*index;
	scanf("%d%d%d",&n,&k,&m);
	a = (int **)malloc(n*sizeof(int*));
	b = (int **)malloc(n*sizeof(int*));
	index = (int *)malloc(n*sizeof(int));
	for(i=0;i<n;i++){
		a[i] = (int *)malloc(k*sizeof(int));
		b[i] = (int *)malloc(k*sizeof(int));
		index[i] = 1;							//每个机器人都必须参加
	}
	for(i=0;i<n;i++){
		for(j=0;j<k;j++){
			scanf("%d",&a[i][j]);
			if(j==0){
				b[i][j] = a[i][j];
			}else{
				b[i][j] = a[i][j] - a[i][j-1];
			}
//			printf("%4d",b[i][j]);
		}
//		printf("\n");
	}
	int minIndex;					//记录下一步耗时最少的机器人编号
	for(i=n;i<m;i++){
		minIndex=0;
		while(index[minIndex]>=k){
			minIndex++;				//第一个可用的机器人编号
		}
		for(j=minIndex+1; j<n; j++){
			if(index[j]<k && b[j][index[j]]<b[minIndex][index[minIndex]]){
				minIndex = j;
			}
		}
		index[minIndex]++;
	}
	int totalTime = 0;
	for(i=0;i<n;i++){
		totalTime += a[i][index[i]-1];
	}
	printf("%d\n",totalTime);
}
*/


#include<iostream>
#define MAX_N 100
int a[MAX_N][MAX_N];
int b[MAX_N][MAX_N];
int index[MAX_N];
int main(){
	int n,k,m,i,j;
	scanf("%d%d%d",&n,&k,&m);
	for(i=0;i<n;i++){
		index[i]=1;
		for(j=0;j<k;j++){
			scanf("%d",&a[i][j]);
			if(j==0){
				b[i][j]=a[i][j];
			}else{
				b[i][j]=a[i][j]-a[i][j-1];
			}
		}
	}
	int minIndex;
	for(i=n;i<m;i++){
		minIndex=0;
		while(index[minIndex]>=k){
			minIndex++;
		}
		for(j=minIndex+1;j<n;j++){
			if(index[j]<k && b[j][index[j]]<b[minIndex][index[minIndex]]){
				minIndex = j;
			}
		}
		index[minIndex]++;
	}
	int totalTime = 0;
	for(i=0;i<n;i++){
		totalTime+=a[i][index[i]-1];
	}
	printf("%d\n",totalTime);
}





你可能感兴趣的:(ACM,南邮OJ,登山机器人问题)