10.2解题报告

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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解题报告的主要内容,如果未能解决你的问题,请参考以下文章

解题报告 smoj 2019初二创新班(2019.3.17)

数据结构荣誉课---第一次实验解题报告

数据结构荣誉课---第一次实验解题报告

数据结构荣誉课---第一次实验解题报告

数据结构荣誉课---第一次实验解题报告

结题报告——2018级2016第二学期第四周作业10.2