免费馅饼 Why WA

免费馅饼

Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 1576  Solved: 577

Description

都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接。但由于小径两侧都不能站人,所以他只能在小径上接。由于gameboy平时老呆在房间里玩游戏,虽然在游戏中是个身手敏捷的高手,但在现实中运动神经特别迟钝,每秒种只有在移动不超过一米的范围内接住坠落的馅饼。现在给这条小径如图标上坐标:

为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中期中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼)

Input

输入数据有多组。每组数据的第一行为以正整数n(0 < n < 100000),表示有n个馅饼掉在这条小径上。在结下来的n行中,每行有两个整数x,T(0 <= T < 100000),表示在第T秒有一个馅饼掉在x点上。同一秒钟在同一点上可能掉下多个馅饼。n=0时输入结束。

Output

每一组输入数据对应一行输出。输出一个整数m,表示gameboy最多可能接到m个馅饼。提示:本题的输入数据量比较大,建议用scanf读入,用cin可能会超时。

Sample Input

6
5 1
4 1
6 1
7 2
7 2
8 3
0

Sample Output

4
WA:
 1 #include<stdio.h>
 2 int maxT(int a,int b,int c)
 3 {
 4     if(a<b)
 5         a=b;
 6     if(a<c)
 7         a=c;
 8     return a;
 9 }
10 int max(int a,int b)
11 {
12     return a>=b?a:b;
13 }
14 int main()
15 {
16     //freopen("a.txt","r",stdin);
17     int n,coords[100020],hour[100020];
18     int dp[15][100020];
19     int maxn;
20     int i,j,k;
21     while(scanf("%d",&n)!=EOF,n)
22     {
23         for(i=1;i<=n;i++)
24         {
25             scanf("%d%d",&coords[i],&hour[i]);
26             ++coords[i];
27         }
28         for(i=0;i<=12;i++)
29             for(j=0;j<=hour[n];j++)
30             {
31                 dp[i][j]=0;
32             }
33 
34         j=1;
35         for(i=1;i<=hour[n];i++)
36         {
37             while(hour[j]==i)
38             {
39                 dp[coords[j]][i]++;
40                 j++;
41             }
42         }
43         for(i=1;i<=4;i++)
44             dp[i][1]=0;
45         for(i=8;i<=11;i++)
46             dp[i][1]=0;
47     /*    for(i=1;i<=11;i++)
48         {
49             printf("
");
50             for(j=1;j<=hour[n];j++)
51                 printf("%-4d",dp[i][j]);
52         }
53         printf("
");*/
54         maxn=maxT(dp[5][1],dp[6][1],dp[7][1]);
55         for(j=2;j<=hour[n];j++)
56             for(i=1;i<=11;i++)
57             {
58                 if(!(dp[i-1][j-1]==0&&dp[i][j-1]==0&&dp[i+1][j-1]==0))
59                 {
60                     dp[i][j]+=maxT(dp[i-1][j-1],dp[i][j-1],dp[i+1][j-1]);
61                     maxn=max(maxn,dp[i][j]);
62                 }
63                 else
64                 {
65                     dp[i][j]=0;
66                 }
67             }
68      /*   for(i=1;i<=11;i++)
69         {
70             printf("
");
71             for(j=1;j<=hour[n];j++)
72                 printf("%-4d",dp[i][j]);
73         }
74         printf("
");*/
75         printf("%d
",maxn);
76     }
77     return 0;
78 }
View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #define  MAX 100005
 4 int dp[MAX][12],a[MAX],b[MAX];
 5 int max_1(int a,int b,int c,int d)
 6 {
 7     int max1,max2;
 8     max1=a+b>a+c?a+b:a+c;
 9     max2=max1>a+d?max1:a+d;
10     return max2;
11 }
12 int max_2(int a,int b,int c)
13 {
14     return a+b>a+c?a+b:a+c;
15 }
16 int main()
17 {
18     //freopen("a.txt","r",stdin);
19     int n;
20     while(scanf("%d",&n),n)
21     {
22         int max=-999999;
23         memset(dp,0,sizeof(dp));
24         for(int i=1;i<=n;i++){
25             scanf("%d %d",&a[i],&b[i]);
26             dp[b[i]][a[i]]+=1;
27             max=max>b[i]?max:b[i];
28         }
29     //    for(int i=max;i>=0;i--)
30     //    {
31     //        for(int j=5-i;j<=5+i;j++)
32     //        printf("%d  ",dp[i][j]);printf("
");
33     //    }
34     //    printf("%d
",max);
35         for(int i=max;i>=0;i--)
36         {
37             if(i<=4)
38             {
39                 for(int j=5-i;j<=5+i;j++)
40                 {
41                     dp[i][j]=max_1(dp[i][j],dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]);
42     //                  printf("%d  ",dp[i][j]);
43                 }
44     //            printf("
");
45             }
46             else
47             {
48                 for(int j=0;j<=10;j++)
49                 {
50                     if(j==0)
51                     {
52                         dp[i][j]=max_2(dp[i][j],dp[i+1][j],dp[i+1][j+1]);
53                     }
54                     else if(j==10)
55                     {
56                         dp[i][j]=max_2(dp[i][j],dp[i+1][j-1],dp[i+1][j]);
57                     }
58                     else
59                     {
60                         dp[i][j]=max_1(dp[i][j],dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]);
61                     }
62                 }
63             }
64         }
65         printf("%d
",dp[0][5]);
66     //    printf("%d %d %d
",dp[1][4],dp[1][5],dp[1][6]);
67     }
68     return 0;
69 }
AC
 1 #include<stdio.h>
 2 #include<string.h>
 3 int dp[100005][15];
 4 int max(int a,int b)
 5 {
 6     return a>=b?a:b;
 7 }
 8 int main()
 9 {
10     //freopen("a.txt","r",stdin);
11     int n,i,j,maxt;
12     int x,t;
13     while(scanf("%d",&n),n)
14     {
15         maxt=0;
16         memset(dp,0,sizeof(dp));
17         for(i=0;i<n;i++)
18         {
19             scanf("%d%d",&x,&t);
20             dp[t][x]++;
21             if(maxt<t)  maxt=t;
22         }
23         for(i=maxt-1;i>=0;i--)
24         {
25             dp[i][0]+=max(dp[i+1][1],dp[i+1][0]);
26             for(j=1;j<11;j++)
27             {
28                 dp[i][j]+=max(max(dp[i+1][j-1],dp[i+1][j]),dp[i+1][j+1]);
29             }
30         }
31         printf("%d
",dp[0][5]);
32     }
33     return 0;
34 }
AC简约版
原文地址:https://www.cnblogs.com/get-an-AC-everyday/p/4186802.html