zoukankan      html  css  js  c++  java
  • 题目--求一个数组的最大子数和和最大子数组 及 判断上三角矩阵

    2019年春季学期第三周作业:

    第一题:

    给定一个整数数组(包含正负数),找到一个具有最大和的子数组,返回其最大的子数组的和。

    例如:[1, -2, 3, 10, -4, 7, 2, -5]的最大子数组为[3, 10, -4, 7, 2]
    输入:
    请建立以自己英文名字命名的txt文件,并输入数组元素数值,元素值之间用逗号分隔。
    输出
    在不删除原有文件内容的情况下,将最大子数组以及子数组的和写入文件。

    关于这个题目,我先用C++把解题的算法写了出来,先发解题算法,便于理解,接下来再发利用文件输入输出后的整段代码。

    代码1:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main (int argc,const char * argv[])
     4 {
     5     int arr[100];//先定义一个整形数组
     6     int n,t,x;//t是最大子数和数组终止下标,X是起始下标
     7     cin>>n;//输入数组元素数量
     8     for(int i=0;i<n;i++)cin>>arr[i];//赋值
     9     int ans=0,maxs=0;//定义一个字数和,和最大字数和
    10     for(int i=0;i<n;i++)//遍历所有元素
    11     {
    12         ans+=arr[i];//累加每个元素
    13         if(ans>maxs){t=i;maxs=ans;}//如果ans大于maxs,证明此时还是一个连续的最大和子数组,并且用maxs标记该值
    14         if(ans<0){ans=0;x=i+1;}//如果ans小于0,则证明此时一定小于之前的子数和,直接从i+1个下标开始找下一个最大子数和数组
    15     }
    16     for(int i=x;i<=t;i++)//输出连续的最大子数和数组
    17     cout<<arr[i]<<" ";
    18     return 0;
    19 }

    下面这段代码是用C语言来利用文件完成输入输出,并且将需要的数值写入文件:(由于解题算法代码中已解释,该处代码简单标注一下,不多做解释)

     1 #include<bits/stdc++.h>
     2 
     3 #define MAXN 10000
     4 int main ( int argc , const char * argv[])
     5 {
     6     FILE * FP;
     7     ((FP=fopen("D:\zdzsh.txt","a+"))==NULL)?printf("fail
    "):printf("OK!
    ");
     8     int arrs[MAXN],n;
     9     scanf("%d",&n);
    11     for(int i=0;i<n;i++){
    12         fscanf(FP,"%d,",&arrs[i]);//从文件读入整形数值和用来分离的逗号
    13     }
    14     int ans=0,maxs=0,t,x;
    15     for(int i=0;i<n;i++)
    16     {
    17         ans+=arrs[i];
    18         if(ans>maxs){t=i;maxs=ans;}
    19         if(ans<0){ans=0;x=i+1;}
    20     }
    21     for(int i=0;i<n;i++)printf("%d ",arrs[i]);
    22     printf("
    ");
    23     
    24     FP=fopen("D:\zdzsh.txt","a+");//由于直接从文件读入数据,文件指针需要重置到最前方才能继续写入数据
    25     fprintf(FP,"
    ");
    26     for(int i=x;i<=t;i++){printf("%d ",arrs[i]);fprintf(FP,"%d ",arrs[i]);}
    27     printf("
    %d",maxs);
    28     fprintf(FP,"
    %d",maxs);
    29     
    30     fclose(FP);
    31     return 0;
    32 }

    设计思路

    本题调试过程中遇到的问题及解决方法

    由于之前文件指针一直没有重置,导致反复试无法将数据输入至文件当中.只需再次输入绝对路径重置文件指针即可。

    运行结果截图

     第二题:

    7-1 判断上三角矩阵 (15 分)

    上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。

    本题要求编写程序,判断一个给定的方阵是否上三角矩阵。

    输入格式:

    输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。

    输出格式:

    每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。

    输入样例:

    2
    3
    1 2 3
    0 4 5
    0 0 6
    2
    1 0
    -8 2

    输出样例:

    YES
    NO

    本题目比较容易,只要不粗心,一般一遍过..注意需要遍历的范围即可。

    代码:

     1 #include <bits/stdc++.h>
     2 #define MAXN 101
     3 using namespace std;
     4 int num_jz[MAXN][MAXN]={0};//初始化二维数组
     5 int main(int argc,const char * argv[])
     6 {
     7     int T,n;
     8     cin>>T;//T组数据
     9     while(T--){
    10         int flag=0;
    11         cin>>n;//n行n列
    12         for(int i=0;i<n;i++){
    13             for(int j=0;j<n;j++){
    14                 cin>>num_jz[i][j];
    15             }
    16         }
    17         for(int i=0;i<n;i++){                //遍历范围
    18             for(int j=0;j<i;j++){
    19                 if(num_jz[i][j]!=0){flag=1;break;}
    20             }
    21         }
    22         if(flag==0)cout<<"YES"<<endl;
    23         else cout<<"NO"<<endl;
    24         }
    25         return 0;
    26 }

    设计思路

    本题调试过程中遇到的问题及解决方法

    遍历范围出现问题,遍历超出了所需要判断的范围。其余无大问题。

    运行结果截图

    自我评价:此次题目难度不是很高,但写的过程中还有很多粗心的地方,导致一些简单的地方卡住,还是希望下次自己能认真点写...

    学习总结:

    学习总结: 存在的问题 心得 完成作业消耗时间 本周学习内容
      对文件读取数据的运用不是很熟练 多去看关于刷题的书籍,有助于提高自己写题能力,实在不会的可以参考大佬的代码,加以自己理解之后去默写几遍 半小时左右 文件输入,BFS,DFS,PARTITION算法及简单的贪心算法
  • 相关阅读:
    08-12 NOIP模拟测试18
    08-09 NOIP模拟测试15
    08-11 NOIP模拟测试17
    08-10 NOIP模拟测试16
    08-07 NOIP模拟测试14
    08-03 NOIP模拟测试12
    [SDOI2011]拦截导弹
    08-01 NOIP模拟测试11
    零散知识点
    07-29 NOIP模拟测试10
  • 原文地址:https://www.cnblogs.com/xiangqi/p/10524261.html
Copyright © 2011-2022 走看看