8月11号的练习:POJ 3094&&HDU 1175&&HDU 2602&&HDU 2059

                                  Quicksum POJ 3094

非常水:

 

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<stdio.h>
 4 #include<string.h>
 5 #include<string>
 6 using namespace std;
 7 int main()
 8 {
 9     char a[260];
10     int n,sum,i;
11     while(3)
12     {
13         gets(a+1);
14         if(a[1]=='#')
15             break;
16         n=strlen(a+1);
17         sum=0;
18         for(i=1;i<=n;i++)
19         {
20             if(a[i]<'A'||a[i]>'Z')
21                 continue;
22             else
23             {
24                 sum+=i*(a[i]-'A'+1);
25             }
26         }
27         printf("%d\n",sum);
28     }
29     return 0;
30 }

 

                                             连连看 HDU 1175

终于有感觉了!!!

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace std;
 6 int b[4][2]={0,1,0,-1,1,0,-1,0};
 7 int a[1005][1005],c1[1005][1005],t,flag,n,m,x2,y2;
 8 void dfs(int x,int y,int z)
 9 {
10     int i,z1,x1,y1;
11     if(x==x2&&y==y2&&t<=2)
12     {
13         flag=1;
14         return ;
15     }
16     if(t==2)
17     {
18         if(x-x2!=0&&y-y2!=0)
19             return ;
20         if(x-x2==0&&y-y2!=0&&z!=-1)
21             return ;
22         if(x-x2!=0&&y-y2==0&&z!=1)
23             return ;
24     }//此处剪枝最重要!不然就会超时!!
25     if(t>=3)
26         return ;
27     if(flag)
28         return ;
29     for(i=0;i<4;i++)
30     {
31         x1=x+b[i][0];
32         y1=y+b[i][1];
33         if(x1-x!=0)
34             z1=1;
35         if(y1-y!=0)
36             z1=-1;
37         if(x1>=1&&x1<=n&&y1>=1&&y1<=m&&!c1[x1][y1]&&(a[x1][y1]==0||x1==x2&&y1==y2))//还要注意重点不为零要格外地判断
38         {
39             c1[x1][y1]=1;
40             if(z1!=z&&z!=0)
41                 t++;
42             dfs(x1,y1,z1);
43             c1[x1][y1]=0;
44             if(z1!=z&&z!=0)
45                 t--;//此处进行了回溯!
46         }
47     }
48 }
49 int main()
50 {
51     int i,j,x1,y1,t1;
52     while(scanf("%d%d",&n,&m)!=EOF)
53     {
54         if(n==0&&m==0)
55             break;
56         memset(c1,0,sizeof(c1));
57         for(i=1;i<=n;i++)
58             for(j=1;j<=m;j++)
59              {
60                  scanf("%d",&a[i][j]);
61                  if(a[i][j]!=0)
62                     c1[i][j]=1;
63              }
64         scanf("%d",&t1);
65         while(t1--)
66         {
67             scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
68             if(a[x1][y1]!=a[x2][y2])
69             {
70                 printf("NO\n");
71                 continue;
72             }
73             if(a[x1][y1]==0||a[x2][y2]==0)
74             {
75                 printf("NO\n");
76                 continue;
77             }
78             flag=0;t=0;c1[x2][y2]=0;
79             dfs(x1,y1,0);
80             c1[x2][y2]=1;
81             if(flag==0)
82                 printf("NO\n");
83             else
84                 printf("YES\n");
85         }
86     }
87     return 0;
88 }//Z用来判断是否拐弯的

                                          Bone Collector HDU 2602

非常水的背包问题:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<stdio.h>
 4 #include<string.h>
 5 using namespace std;
 6 int main()
 7 {
 8     int a[1005],b[1005];
 9     int c[10005];
10     int t,i,j,n,m;
11     scanf("%d",&t);
12     while(t--)
13     {
14         scanf("%d%d",&n,&m);
15         for(i=1;i<=n;i++)
16             scanf("%d",&a[i]);
17         for(j=1;j<=n;j++)
18             scanf("%d",&b[j]);
19         memset(c,0,sizeof(c));
20         for(i=1;i<=n;i++)
21         {
22                 for(j=m;j>=b[i];j--)
23                 {
24                     if(c[j]<c[j-b[i]]+a[i])
25                         c[j]=c[j-b[i]]+a[i];
26                 }
27         }
28         printf("%d\n",c[m]);
29     }
30     return 0;
31 }

                                               龟兔赛跑   HDU 2059

一道动态规划题目:重点找到状态转移方程!

看到解释就很好懂了,属于那种爆发型的。。。

 

定义状态dp[i]表示的是乌龟到第i个加油站时花费的最短时间。
那么dp[i] = min(dp[i],dp[j]+time);其中j < i且time是
在j加油后走到i所花的时间。意思就是,从0~j这些加油站中,选
择哪个来加油才能使去到i的时间最短。所以时间复杂度是O(n^2)。
不过值得注意的细节时,把起点和终点也当成加油站,上述的0就是
指起点。其中起点是是不用花时间的加油站。

 

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 using namespace std;
 5 int main()
 6 {
 7     int L,n,c,t,v,v1,v2,a[105],i,j;
 8     double d,dp[105],temp;
 9     while(~scanf("%d",&L))
10     {
11         scanf("%d%d%d",&n,&c,&t);
12         scanf("%d%d%d",&v,&v1,&v2);
13         for(i=1;i<=n;i++)
14             scanf("%d",&a[i]);
15         a[0]=0;
16         a[n+1]=L;
17         for(i=1;i<=n+1;i++)
18             dp[i]=10000005;
19         dp[0]=0;
20         d=L*1.0/v;//没有(*1.0)会错的。。。(double与int的转化)
21         for(i=1;i<=n+1;i++)
22         {
23             for(j=0;j<i;j++)
24             {
25                 if(a[i]-a[j]<=c)
26                     temp=(a[i]-a[j])*1.0/v1+t;
27                 else
28                     temp=c*1.0/v1+t+(a[i]-a[j]-c)*1.0/v2;
29                 if(!j)
30                     temp-=t;//起点不算加速时间!
31                 dp[i]=min(dp[i],dp[j]+temp);
32             }
33         }
34         if(dp[n+1]<d)
35             printf("What a pity rabbit!\n");
36         else
37             printf("Good job,rabbit!\n");
38     }
39     return 0;
40 }

 

 

 

 

posted on 2013-08-12 11:15  ~~碾压机  阅读(156)  评论(0编辑  收藏  举报