zoukankan      html  css  js  c++  java
  • 8-6-Exercise

    HDU 1003    Max Sum 

    题意:给出一串数字,求出其中某段连续的数字之和最大的值,同时要输出起点的位置和终点的位置~~~

    方法一:

         用sum记录某一段和的值,maxx为目前为止最大的sum值,当sum+a[i]<0时,sum清零,同时更新起点值~,当sum>max时,使max=sum,同时更新要输出的起点值start以及要输出的终点值end~

    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     int t,n,cas=0;
     9     scanf("%d",&t);
    10     while(t--)
    11     {
    12         cas++;
    13         int i,j,sum=0,start=0,endd=0,a,maxx=-12345678,f,e;
    14         scanf("%d",&n);
    15         for(i=0,f=0,e=0;i<n;i++)
    16         {
    17             scanf("%d",&a);
    18             sum+=a;
    19             if(sum>maxx)
    20             {
    21                 maxx=sum;        //跟新要输出的最大值,起点值,终点值~
    22                 start=f;
    23                 endd=i;
    24             }
    25             if(sum<0)
    26             {
    27                 sum=0;            //清零~并更新下一组数字的起点值~
    28                 f=i+1;
    29             }
    30             e=i;
    31         }
    32         printf("Case %d:
    ",cas);
    33         printf("%d %d %d
    ",maxx,start+1,endd+1);
    34         if(t) printf("
    ");
    35     }
    36     return 0;
    37 }

    //memory:228KB  time:0ms

    POJ 1050   To the Max

    题意:

          给出一个矩阵,求出其中最大的子矩阵之和~其实与上题很相似~

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 #define N 110
     5 int a[N][N];
     6 int b[N];
     7 int main(){
     8     int n,r;
     9     cin>>r;
    10     memset(a,0,sizeof(a));
    11     for(int i=1;i<=r;++i)
    12         for(int j=1;j<=r;++j)
    13         {
    14             cin>>a[i][j];
    15             a[i][j]+=a[i-1][j];
    16         }
    17         int max=a[1][1];
    18         for(int i=0;i<=r-1;++i)
    19             for(int j=i+1;j<=r;++j)
    20             {
    21                 memset(b,0,sizeof(b));
    22                 for(int k=1;k<=r;++k)
    23                 {
    24                     if(b[k-1]>=0)
    25                         b[k]=b[k-1]+a[j][k]-a[i][k];
    26                     else
    27                         b[k]=a[j][k]-a[i][k];
    28                     if(max<b[k])
    29                         max=b[k];
    30                 }
    31             }
    32     cout<<max<<endl;
    33 }

    //memory:276KB  time:32ms

    HDU 1800      Flying to the Mars

    其实就是求排列(从大到小)好的最长上升子序列长度~

    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 class A
     8 {
     9 public:
    10     int x,id;
    11 }a[3000];
    12 
    13 bool comp(A k,A y)
    14 {
    15     return k.x>y.x;
    16 }
    17 
    18 int main()
    19 {
    20     int n;
    21     while(~scanf("%d",&n))
    22     {
    23         int i,j,number=0,minn;
    24             memset(a,0,sizeof(a));
    25         for(i=0;i<n;i++)
    26             scanf("%d",&a[i].x);
    27         sort(a,a+n,comp);
    28         for(i=0;i<n;i++)
    29             if(a[i].id==0)
    30             {
    31                 number++;
    32                 a[i].id=1;
    33                 minn=a[i].x;
    34                 for(j=i+1;j<n;j++)
    35                     if(a[j].id==0 && a[j].x<minn)
    36                 {
    37                     minn=a[j].x;
    38                     a[j].id=1;
    39                 }
    40             }
    41             printf("%d
    ",number);
    42     }
    43 }

    //memory:252KB  time:312ms

    HDU 2036     改革春风吹满地

    题意:求面积~

    该题目是有公式的~

    代码:

     1 #include <iostream>//这是直接用叉积求多边形面积的
     2 #include <algorithm>
     3 #include <cstdio>
     4 #include <string.h>
     5 #include <iostream>
     6 #include <cmath>
     7 #include <stdlib.h>
     8 using namespace std;
     9 int main()
    10 {
    11     double s;
    12     int n,i;
    13     int x1,y1,x2,y2,x3,y3;
    14     while(scanf("%d",&n),n)
    15     {   s=0;
    16         scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    17         for(i=2;i<n;i++)
    18         {
    19             scanf("%d%d",&x3,&y3);
    20             s+=(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);
    21             x2=x3;y2=y3;
    22         }
    23         s=s>0?s:-s;
    24         printf("%.1lf
    ",s*0.5);
    25 
    26     }
    27     return 0;
    28 }

    //memory:240KB   time:0ms

    POJ 1088      滑雪

    题意:找出最长的路径~

    代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 int r,c,a[100][100],dp[100][100],add[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
     7 
     8 int get_high(int x,int y)
     9 {
    10   if(dp[x][y]>1)
    11     return dp[x][y];
    12   int maxx=1,i,j,hx,hy;
    13   for(i=0;i<4;i++)
    14   {
    15     hx=x+add[i][0];
    16     hy=y+add[i][1];
    17     if(a[x][y]>a[hx][hy] && hx>=0 && hy>=0 && hx<r && hy<c)
    18     {
    19       int h=get_high(hx,hy)+1;
    20       if(h>maxx) maxx=h;
    21     }
    22   }
    23   return maxx;
    24 }
    25 
    26 int main()
    27 {
    28   int i,j,maxx;
    29   while(~scanf("%d%d",&r,&c))
    30   {
    31     memset(dp,0,sizeof(dp));
    32     for(i=0;i<r;i++)
    33       for(j=0;j<c;j++)
    34       {
    35         scanf("%d",&a[i][j]);
    36         dp[i][j]=1;
    37       }
    38     for(i=0,maxx=0;i<r;i++)
    39       for(j=0;j<c;j++)
    40       {
    41         dp[i][j]=get_high(i,j);
    42         if(dp[i][j]>maxx)
    43           maxx=dp[i][j];
    44       }
    45     printf("%d
    ",maxx);
    46   }
    47   return 0;
    48 }

    //memory:224KB  time:16ms

  • 相关阅读:
    Spring IOC 和 AOP
    Java 类加载机制
    面向对象程序设计思想简述
    Linux 卸载 MySQL 数据库
    Linux 安装 mysql 数据库
    Linux 配置 JDK
    Linux 指令
    去除字符串里面的某些字符替换成另一个字符
    jsp有哪些内置对象?作用分别是什么? 分别有什么方法?
    jsp有哪些动作?作用分别是什么?
  • 原文地址:https://www.cnblogs.com/teilawll/p/3243472.html
Copyright © 2011-2022 走看看