首页 > 代码库 > 10.2解题报告

10.2解题报告

题目一:栈的优化

原代码:运用函数递归

由于我们知道火车出来的个数与火车总共的个数一定是一样的,所以可以用0 1来表示车辆的出入。

如:101100 就表示进出进进出出,也就为132.

我们用ruv来表示进入的车子数,chuv表示出来的车子数,当chuv和ruv都等于撤资总数时,我们就找到了一种排列方法。
当ruv小于n时,说明已经进去的车子数没到n节,还有空间继续进入车辆,我们可以写作
if(ruv<n) dfs(ruv+1,chuv);
我们要保证出去的车子比进来的车子少,这样才可以符合实际的情况。所以当chuv小于ruv的时候我们可以把chuv加上一,表示可以出去车辆
写作 if(chuv<ruv) dfs(ruv,chuv+1);
其实我们可以把栈想象成一个二维数组,行为ruv,列为chuv,所有ruv<chuv的坐标全部没有意义
和函数的思维方法一样,我们可以把第a[i][j]个数分为两种情况,并且选择从最后一个数向前做运算,这样和我们之前的思维方法就一样了。
首先将第一个数a[n][n]定义为1,表示起始值为1
接着和之前一样做出当i<n和j<i的判断,最后a[0][0]所表示的值就是结果了,因为我们的行和列都是从0开始记录的。
附注:
for(int i=n;i>=0;i--)	for(int j=n;j>=0;j--){        if(i==n&&j==n) a[i][j]=1;	    else         {        if(i<n) a[i][j]+=a[i+1][j];        if(j<i) a[i][j]+=a[i][j+1];}}
二:接水问题
学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。
现在有n  名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1到n 编号,i 号同学的接水量为wi。接水开始时,1 到m   号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学j 完成其接水量要求wj 后,下一名排队等候接水的同学k马上接替j   同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即j 同学第x 秒结束时完成接水,则k 同学第x+1   秒立刻开始接水。若当前接水人数n’不足m,则只有n’个龙头供水,其它m-n’个龙头关闭。
现在给出n  名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。
这一题可以直接模拟
每一次都循环m个水龙头,找出时间最短的,加上下一个人接水的时间,因为在这个时间内,别人也可以接好水,最后可以找出时间最多的那一个水龙头,那么它就是总共接水需要的时间了。
例如:1 2 3 4 5 有3个水龙头
首先1 2 3中最少的1加上下一个4,在这段时间内,2 3接好了水,然后最少的2加上最后的5,在这期间内,3 4接好了水,最后找出时间最长的2+5,就是问题的解。
我们可以先一个一个读入数字,存入一个数组,然后把m+1定义为下一个人
for(int i=1;i<=n;i++){    cin>>t;   	b[i]=t;    s=m+1;     }
然后进行中途的交换
while(n>0)     {            for(int i=1;i<=m;i++)                if(b[i]<b[minv]) minv=i;            b[minv]+=b[s];            s++;            n--;    }
minv记录时间最短的那一个数,s++是因为下一个人需要退后,n--是为了判断是不是所有人都接上水。
最后只需要再找出最大数输出即可。
for(int i=1;i<m;i++)    for(int j=i;j<=m;j++){    	if(b[i]>b[j]){    		int t=b[i];    		b[i]=b[j];    		b[j]=t;    	}    }    cout<<b[m];2
 
 
 

10.2解题报告