网站:CSUST小练习1
以后每天21:30~23:30都有小练
大意是:给出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 }
这一题和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 }
D 改革春风吹满地 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 }