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:\n%d %d %d\n",k,max,st,end);

30         if(T)

31             printf("\n");

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\n",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\n",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\n",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\n",max+1);

41     return 0;

42 }

 

你可能感兴趣的:(8月6日小练)