zoukankan      html  css  js  c++  java
  • 8月6日小练

    网站:CSUST小练习1

    以后每天21:30~23:30都有小练

    Max Sum     HDU 1003

    大意是:给出n个数,找出最大的和,输出起点和终点的编号

    本来是暴力做,不出所料的超时了Orz....

    代码:       15MS

     1 #include<iostream>
     2 #include<stdio.h>
     3 using namespace std;
     4 int main()
     5 {
     6     int T,a,k=0;
     7     scanf("%d",&T);
     8     while(T--)
     9     {
    10         k++;
    11         int n,st=0,max=-999999999,i,j,sum=0,end=0;
    12         scanf("%d",&n);
    13         for(i=j=1;j<=n;j++)
    14         {
    15             scanf("%d",&a);
    16             sum+=a;  
    17             if(sum>max)   //更新最大值
    18             {
    19                 max=sum;
    20                 st=i; //更新起点
    21                 end=j;  //更新终点
    22             }
    23            if(sum<0)   //sum<0,抛弃前面的点
    24            {
    25                i=j+1;  //更新起点
    26                sum=0;   //和清0
    27            }
    28         }
    29         printf("Case %d:
    %d %d %d
    ",k,max,st,end);
    30         if(T)
    31             printf("
    ");
    32     }
    33     return 0;
    34 }

    B  To the Max  POJ 1050

    这一题和A很像,A是一维的求最大和,B是二维的求最大和。      16MS

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<iostream>
     4 using namespace std;
     5 int main()
     6 {
     7     int n,a[105][105],b[105],max,i,j,k,f;
     8     while(~scanf("%d",&n))
     9     {
    10         max=-100000000;
    11         for(i=1;i<=n;i++)
    12             for(j=1;j<=n;j++)
    13             scanf("%d",&a[i][j]);
    14         for(i=1;i<=n;i++)   
    15         {
    16             memset(b,0,sizeof(b));
    17           for(j=i;j<=n;j++)     //开始的行
    18           {
    19               for(k=1;k<=n;k++)  //
    20                 b[k]+=a[j][k];
    21               f=0;
    22               for(k=1;k<=n;k++)
    23               {
    24                   if(f+b[k]>0)
    25                       f+=b[k];
    26                   else
    27                     f=0;    //f<=0时,f清0
    28                   if(f>max)
    29                     max=f;   //更新最大值
    30 
    31               }
    32           }
    33         }
    34         printf("%d
    ",max);
    35     }
    36     return 0;
    37 }

    C     Flying to the Mars     HDU 1800         就是求下降子序列的最少个数,不过这道题可以先排序再求,因为不想再写个函数,直接用sort,升序排列,所以我这是求上升子序列最少的个数。        296MS

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 #include<iostream>
     5 using namespace std;
     6 int main()
     7 {
     8     int n,i,a[3005],map[3005];
     9     while(~scanf("%d",&n))
    10     {
    11         int number=0,minn;
    12         memset(map,0,sizeof(map));
    13         for(i=1;i<=n;i++)
    14             scanf("%d",&a[i]);
    15         sort(a+1,a+n+1);   //升序排序
    16         for(i=1;i<=n;i++)
    17         {
    18             if(map[i]==0)   //未被标记
    19             {
    20             number++;   //个数+1
    21             map[i]=1;  //标记
    22             minn=a[i];
    23             for(int j=i+1;j<=n;j++)
    24                 if(a[j]>minn && map[j]==0)
    25                 {
    26                     minn=a[j];
    27                     map[j]=1;
    28                 }
    29             }
    30         }
    31         printf("%d
    ",number);
    32     }
    33     return 0;
    34 }

    改革春风吹满地     HDU 2036   求多边形的面积,给出的是n边形的逆时针顶点坐标。  

    坑爹啊,这道题有公式!!!!!公式详见:http://www.cnblogs.com/dramstadt/p/3199299.html    

    S = 0.5 * ( (x0*y1-x1*y0) + (x1*y2-x2*y1) + ... + (xn*y0-x0*yn) )
    其中点(x0, y0), (x1, y1), ... , (xn, yn)为多边形上按逆时针顺序的顶点。                                   0ms

     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <math.h>
     4 using namespace std;
     5 int main()
     6 {
     7   int n,x1,y1,x2,y2,sum,i;
     8   while(~scanf("%d",&n)&&n)
     9   {
    10     sum=0.0;
    11     scanf("%d%d",&x1,&y1);
    12     int a=x1,b=y1;   //记录下第一组数据
    13     for(i=2;i<=n;i++)
    14     {
    15       scanf("%d%d",&x2,&y2);    
    16       sum+=x1*y2-x2*y1;   //加和
    17       x1=x2;  
    18       y1=y2;  //更新数据
    19     }
    20     sum+=x1*b-y1*a;    //最后一组数据&第一组数据
    21     printf("%.1lf
    ",sum/2.0);   //取一半,保留一位小数
    22   }
    23    return 0;
    24 }

    F  滑雪    POJ 1088   这道题是求最长的距离......我还以为是求高度差.....Orz                         32MS

     1 #include <iostream>
     2 #include <string.h>
     3 #include <stdio.h>
     4 using namespace std;
     5 const int MAXN = 110;
     6 int map[MAXN][MAXN],dp[MAXN][MAXN];
     7 int r,c,move[4][2]={-1,0,1,0,0,-1,0,1};
     8 inline int MAX(int x,int y)
     9 {
    10     return x>y ? x : y;
    11 }
    12 int dfs(int x,int y)
    13 {
    14     if(dp[x][y]!=-1)   //已被标记
    15         return dp[x][y];
    16     int i,xx,yy,max=0;
    17     for(i=0;i<4;i++)
    18     {
    19         xx=x+move[i][0];
    20         yy=y+move[i][1];
    21         if(map[x][y]>map[xx][yy] && xx>=0 && yy>=0 && xx<r && yy<c)
    22             max=MAX(max,dfs(xx,yy)+1);   //更新最大值
    23     }
    24     return max;
    25 }
    26 int main()
    27 {
    28     int i,j,max=0;
    29     scanf("%d %d",&r,&c);
    30     for(i=0;i<r;i++)
    31         for(j=0;j<c;j++)
    32             scanf("%d",&map[i][j]);
    33     memset(dp,-1,sizeof(dp));
    34     for(i=0;i<r;i++)
    35         for(j=0;j<c;j++)
    36         {
    37             dp[i][j]=dfs(i,j);   //记录这一点的最长距离
    38             max=MAX(max,dp[i][j]);   //更新最大值
    39         }
    40     printf("%d
    ",max+1);
    41     return 0;
    42 }
  • 相关阅读:
    Java :BufferedWriter类和BufferedReader类的构造方法、主要方法
    多线程:四大线程池详解
    多线程:head first Thread.join()
    多线程: 多线程中断机制
    多线程:深入Thread.sleep
    多线程:线程池原理
    java:java构造器和java方法的区别
    java: Java中this和super的用法总结
    postman: 用于网页调试和发送Http请求的chrome插件
    json:JSONObject包的具体使用(JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包)
  • 原文地址:https://www.cnblogs.com/riddle/p/3243102.html
Copyright © 2011-2022 走看看