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
",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
");continue;}
77             if(bfs(x1,y1))
78                 printf("YES
");
79             else
80                 printf("NO
");
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:
",++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
",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
",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!
");
34         else
35             printf("What a pity rabbit!
");
36     }
37     return 0;
38 }

//memory:284KB  time:15ms

原文地址:https://www.cnblogs.com/teilawll/p/3252282.html