算法导论--装备线调度(升序&&降序输出)

题意就先不用讲了吧,感觉自己还没有掌握核心的东西。

//心得
//怎样保持路径,递归的实现

#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
#include<cstring>
using namespace std;
int a[100][100];//time for station
int t[100][100];//time for from Li to Lj
int f[100][100];//recorded time
int l[100][100];//keep trace of fastest ways,比如l[1][6]==2,说明l[1][6]是从
				//lines 2过来的
int e[2];//into time
int ss[100];
int x[2];//depart time
int last_time;

/*******test data*********
1
6
7 9 3 4 8 4
8 5 6 4 5 7
2 3 1 3 4
2 1 2 2 1
2 4
3 2
*************************/
/********core code******/

int assmbly_line(int m)
{
	int ff;
	f[1][1]=e[1]+a[1][1];
	f[2][1]=e[2]+a[2][1];//开始时比较进入哪一条装配线
//	printf("\n%d %d",f[1][1],f[2][1]);
	for(int j=2;j<=m;j++){//最优化选择
		if(f[1][j-1]+a[1][j]<=f[2][j-1]+a[1][j]+t[2][j-1])
		{
			f[1][j]=f[1][j-1]+a[1][j];
			l[1][j]=1;
		//	printf("j=%d 1\t",l[1][j]);
		}
		else
		{
			f[1][j]=f[2][j-1]+a[1][j]+t[2][j-1];
			l[1][j]=2;
		//	printf("j=%d 2\t",l[2][j]);
		}
		if(f[2][j-1]+a[2][j]<=f[1][j-1]+t[1][j-1]+a[2][j])
		{
			f[2][j]=f[2][j-1]+a[2][j];
			l[2][j]=2;
		//	printf("j=%d 2\t",l[2][j]);
		}
		else
		{
			f[2][j]=f[1][j-1]+t[1][j-1]+a[2][j];
			l[2][j]=1;
		//	printf("j=%d 1\t",l[2][j]);
		}
	}

		if(f[1][m]+x[1]<=f[2][m]+x[2])
		{
			int i=1;

		ff=f[1][m]+x[1];

		last_time=1;
		}
		else
		{

		ff=f[2][m]+x[2];
		last_time=2;

		}
		return ff;

}
//打印路径降序
 void print_lines(int s[100],int ll,int m)
{
	int i=ll;
	ss[m]=i;//为了后面的升序使用
	printf("lines: %d,stations: %d\n",i,m);
	for(int j=m;j>=2;j--)
	{
		i=l[i][j];
		printf("lines: %d,stations: %d\n",i,j-1);
		ss[j-1]=i;
	}
}
//打印路径升序递归
 void print_cursion_line( int l[][100],int last_l,int n)
{
	int i=last_l;
	if(n==1)
		printf("Lines %d,stations %d\n",i,n);
	else
	{
		print_cursion_line(l,l[i][n],n-1);
		printf("Lines %d,stations %d\n",i,n);
	}

}
//打印路径非递归
 void nocursion_increasing(int ss[100],int m)
{
	for(int i=1;i<=m;i++)
	printf("lines %d,stations %d\n",ss[i],i);
}

//*******core code******//
int main()
{
	int m;
	freopen("in.txt","r",stdin);
	int k;
	scanf("%d",&k);//测试的数据块数
	while(k--){
		memset(a,0,sizeof(a));
		memset(t,0,sizeof(t));
		memset(f,0,sizeof(f));
		memset(l,0,sizeof(l));
		memset(e,0,sizeof(e));
		memset(x,0,sizeof(x));
		scanf("%d",&m);//装配站的数目
		for(int i=1;i<=m;i++)
			scanf("%d",&a[1][i]);
		for(int i=1;i<=m;i++)
			scanf("%d",&a[2][i]);
		for(int i=1;i<m;i++)
			scanf("%d",&t[1][i]);
		for(int i=1;i<m;i++)
			scanf("%d",&t[2][i]);
		for(int i=1;i<=2;i++)
			scanf("%d",&e[i]);
		for(int i=1;i<=2;i++)
			scanf("%d",&x[i]);

	}

		printf("\n");
		int cai=assmbly_line(m);
		printf("The total cast time is %d\n",cai);

                int ll=last_time;
                //以下是打印的路径
                printf("decreaing output is \n");
		print_lines(l[m],ll,m);
		printf("Increaing and oncursion output is \n");
		nocursion_increasing(ss,m);
		printf("increaing cursion is \n");
		print_cursion_line(l,ll,m);
	//	printf("last_time=%d\n",last_time);
}

算法导论--装备线调度(升序&&降序输出)

时间: 2024-11-10 07:04:22

算法导论--装备线调度(升序&&降序输出)的相关文章

javascript实现表格升序降序排列

javascript实现表格升序降序排列的步骤如下: 1,生成表格,并给各列表头添加onclick的排序响应函数 2,取得表格各行的数据,并存入临时数组 3,对该临时数组进行排序 4,利用createDocumentFragment,appendChild方法把排序好的数组转换成表格输出,至此排序完毕. 详细代码如下: 经测试可以直接使用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht

定义一个数字数组,用冒泡排序降序输出

public class M{ int[] array = {2,3,6.5.89.4.1.6}; int b = array.length; int temp = 0; for(int i=0;i<b;i++){ for(int j=i+1;j<b;j++){ if(array[i]>array[j]){ temp = a[i]; a[j] = a[i]; a[j] = temp; } } } System.out.print("array元素的降序排序:"); f

angularJS可以实现常常看到购物车中的升序降序效果

{ "xinxi":[ {"id":100,"name":"baobo","age":12}, {"id":99,"name":"paopo","age":18}, {"id":50,"name":"xinxin","age":55}, {"

java一段数字 分割的升序降序 奇偶数分开排序

/** * 降序升序 * * @param str * @since 0.0.1 */ public void sort(String str){ String[] nums = str.split(" "); List<Integer> odd = new ArrayList<Integer>(); List<Integer> even = new ArrayList<Integer>(); for (String string : n

打印升序降序字母金字塔

/* 需求:打印字母金字塔 思路: 外部使用for循环控制行,里面嵌套3个for循环, 一个控制空格打印, 一个控制字母升序打印, 一个控制字母降序打印 样例: 输入:3 输出: A ABA ABCBA */ #include<stdio.h> int main() { int storey, space, i; char ch; printf("Please enter the number of rows to print: "); scanf("%d&quo

HTML中实现Table表头点击升序/降序排序

1 题目:如下图,请实现表格信息的排序功能,当点击表头的属性区域,将表格信息进行排序切换功能,即第一次点击为降序排序,再一次点击进行升序排序. 2 姓名 力量 敏捷 智力 3 德鲁伊王 17 24 13 4 月之骑士 15 22 16 5 众神之王 19 15 20 6 流浪剑客 23 15 14 7 基本思路: 8 点击将各列数值存入数组第一次点击?(className=="as"?)升序排序(className="desc")按新排列的数组的顺序,将各列赋予新值

lambda linq 表达式 ListBox 的升序 降序 乱序

2020年1月9日 17:50:55 附件 https://files.cnblogs.com/files/xe2011/ListBoxSort.rar 这种方法 如果内容足够多就能看到滚动条闪烁了,我觉得这是列表框清除内容,再添加内容引起的. 用不删除列表,重新赋值的方法能解释闪烁,但过程时间又太长. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u

python读取一个英文文件,并记录每个单词出现的次数,降序输出

对文中出现的句号,逗号和感叹号做了相应的处理 sorted排序函数用法: 按照value值降序排列: sorted(dict.items(),key=lambda k:k[1],reverse=True) 按照value值升序排序: sorted(dict.items(),key=lambda k:k[1],reverse=False)或者sorted(dict.items(),key=lambda k:k[1]) 按照key值降序排列: sorted(dict.items(),key=lamb

将字符串进行降序输出

package DemoArrays; import java.util.Arrays;//导包 import java.util.Random; /* 请使用Arrays相关的API,将一个随机字符串的所有字符升序排列,并且倒序打印 */ public class Work { public static void main(String[] args){ String Str1 = "akoldsal";//创建一个字符串 并且随便输入 //将字符串变成字符串数组 用toStrin