8月6日小练
網站:CSUST小練習1
以后每天21:30~23:30都有小練
A?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 }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
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 }?
轉載于:https://www.cnblogs.com/riddle/p/3243102.html
總結
- 上一篇: [转]Windows Shell 编程
- 下一篇: php的yii框架开发总结2