8-11-Exercise

链接:第四次小练

A.POJ 3094   Quicksum

水题中的水题啊~

直接上代码:

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 using namespace std;

 5 

 6 char a[300];

 7 

 8 int main()

 9 {

10     while(1)

11     {

12         memset(a,0,sizeof(a));

13         gets(a);

14         if(a[0]=='#') break;

15         int i,j,sum=0,k;

16         int n=strlen(a);

17         for(i=0;i<n;i++)

18         {

19             k=a[i]-'A'+1;

20             if(a[i]==' ') k=0;

21             sum+=k*(i+1);

22         }

23         printf("%d\n",sum);

24     }

25     return 0;

26 }
View Code

//memory:160KB  time:0ms

B.HDU 1175   连连看

与以前那道逃离迷宫其实很像..................这道题中采用的是先往一个方向走,到没有路了,换一个方向的时候,就是转弯的时候,记录转弯次数~

代码:

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 using namespace std;

 5 

 6 class Node

 7 {

 8 public:

 9     int x,y,turn;

10 }q[1000024];

11 

12 int n,m,a[1010][1010],x1,x2,y1,y2,add[4][2]={{0,1},{0,-1},{1,0},{-1,0}},hash[1010][1010];

13 

14 int inline push(int x,int y,int turn,int end)

15 {

16     Node t;

17     t.x=x;

18     t.y=y;

19     t.turn=turn;

20     q[end++]=t;

21     return end;

22 }

23 

24 bool inline judge(int x,int y)            //判断该点是否能走......

25 {

26     if(x<=n && x>0 && y<=m && y>0 && a[x][y]==0)

27         return true;

28     else return false;

29 }

30 

31 bool inline bfs(int x,int y)

32 {

33     memset(hash,0,sizeof(hash));

34     int f=0,end=0;

35     end=push(x,y,-1,end);

36     hash[x][y]=1;

37     while(f<end)

38     {

39         if(q[f].turn>=2) return false;

40         for(int i=0;i<4;i++)

41         {

42             int dx=q[f].x+add[i][0];

43             int dy=q[f].y+add[i][1];

44             int turn=q[f].turn+1;

45             while(judge(dx,dy)||(dx==x2 && dy==y2))

46             {

47                 if(dx==x2 && dy==y2 && a[dx][dy]==a[x][y])

48                     return true;

49                 if(!hash[dx][dy])

50                 {

51                     hash[dx][dy]=1;

52                     end=push(dx,dy,turn,end);

53                 }

54                 dx+=add[i][0];                 //在往该方向还能走的时候,继续往该方向走~

55                 dy+=add[i][1];

56             }

57 

58         }

59         f++;

60     }

61     return false;

62 }

63 

64 int main()

65 {

66     while(scanf("%d%d",&n,&m),n,m)

67     {

68         for(int i=1;i<=n;i++)

69             for(int j=1;j<=m;j++)

70                 scanf("%d",&a[i][j]);

71         int k;

72         scanf("%d",&k);

73         while(k--)

74         {

75             scanf("%d%d%d%d",&x1,&y1,&x2,&y2);

76             if(a[x1][y1]==0 || a[x2][y2]==0 || a[x1][y1]!=a[x2][y2]) {printf("NO\n");continue;}

77             if(bfs(x1,y1))

78                 printf("YES\n");

79             else

80                 printf("NO\n");

81         }

82     }

83     return 0;

84 }

//memory:8308KB   time:3562ms

C.HDU 1166   敌兵布阵

其实......哎这道题做过╮(╯▽╰)╭......链接→_→

代码如下:

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 using namespace std;

 5 

 6 const int MAX=55555;

 7 int a[MAX<<2];

 8 

 9 void build(int l,int r,int x)

10 {

11     if(l==r)

12     {

13         scanf("%d",&a[x]);

14         return;

15     }

16     int mid=(l+r)>>1;

17     build(l,mid,x<<1);

18     build(mid+1,r,x<<1|1);

19     a[x]=a[x<<1]+a[x<<1|1];

20 }

21 

22 void update(int p,int w,int l,int r,int x)

23 {

24     if(l==r)

25     {

26         a[x]+=w;

27         return;

28     }

29     int mid=(l+r)>>1;

30     if(p<=mid) update(p,w,l,mid,x<<1);

31     else

32         update(p,w,mid+1,r,x<<1|1);

33     a[x]=a[x<<1]+a[x<<1|1];

34 }

35 

36 int query(int le,int ri,int l,int r,int x)

37 {

38     if(le<=l && ri>=r)

39         return a[x];

40     int mid=(l+r)>>1,re=0;

41     if(le<=mid) re+=query(le,ri,l,mid,x<<1);

42     if(ri>mid) re+=query(le,ri,mid+1,r,x<<1|1);

43     return re;

44 }

45 

46 int main()

47 {

48     int t,n,cas=0;

49     char str[10];

50     scanf("%d",&t);

51     while(t--)

52     {

53         printf("Case %d:\n",++cas);

54         scanf("%d",&n);

55         build(1,n,1);

56         while(1)

57         {

58             scanf("%s",str);

59             if(str[0]=='E') break;

60             int a,b;

61             scanf("%d%d",&a,&b);

62             if(str[0]=='Q') printf("%d\n",query(a,b,1,n,1));

63             else

64                 if(str[0]=='S') update(a,-b,1,n,1);

65             else

66                 update(a,b,1,n,1);

67         }

68     }

69     return 0;

70 }
View Code

//memory:768KB  time:218ms

D.HDU 2602   Bone Collector

很水~DP

代码:

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 using namespace std;

 5 

 6 int w[1111],v[1111],f[43333];

 7 

 8 int main()

 9 {

10     int t,N,V,i,j;

11     scanf("%d",&t);

12     while(t--)

13     {

14         memset(f,0,sizeof(f));

15         memset(w,0,sizeof(w));

16         memset(v,0,sizeof(v));

17         scanf("%d%d",&N,&V);

18         for(i=1;i<=N;i++)

19             scanf("%d",&v[i]);

20         for(i=1;i<=N;i++)

21             scanf("%d",&w[i]);

22         for(i=1;i<=N;i++)

23             for(j=V;j>=w[i];j--)

24             {

25                 int temp=f[j-w[i]]+v[i];

26                 f[j]=max(f[j],temp);

27             }

28         printf("%d\n",f[V]);

29     }

30     return 0;

31 }

//memory:428KB  time:15ms

E.HDU 2059   龟兔赛跑

DP

代码:

 1 #include <stdio.h>

 2 #include <iostream>

 3 #include <float.h>

 4 using namespace std;

 5 

 6 #define MAX 110

 7 int a[MAX];

 8 double dp[MAX];

 9 

10 int main()

11 {

12     int l,n,c,t,vr,v1,v2;

13     while(~scanf("%d%d%d%d%d%d%d",&l,&n,&c,&t,&vr,&v1,&v2))

14     {

15         for(int i=1;i<=n;i++)

16             scanf("%d",&a[i]);

17         a[0]=0;

18         dp[0]=0.0;

19         a[n+1]=l;

20         for(int i=1;i<=n+1;i++)

21         {

22             dp[i]=DBL_MAX;

23             for(int j=0;j<i;j++)

24             {

25                 double len=1.0*(a[i]-a[j]);

26                 double temp=(len>=c)?((c*1.0)/v1+(len-c)*1.0/v2):((len*1.0)/v1);

27                 if(j) temp+=t;

28                 dp[i]=min(dp[i],dp[j]+temp);

29             }

30         }

31         double rabit_time=(l*1.0)/vr;

32         if(dp[n+1]>rabit_time)

33             printf("Good job,rabbit!\n");

34         else

35             printf("What a pity rabbit!\n");

36     }

37     return 0;

38 }

//memory:284KB  time:15ms

你可能感兴趣的:(exe)