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 }
原文地址:https://www.cnblogs.com/riddle/p/3243102.html