免费馅饼 Why WA
免费馅饼
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 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
4WA:
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("\n"); 50 for(j=1;j<=hour[n];j++) 51 printf("%-4d",dp[i][j]); 52 } 53 printf("\n");*/ 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("\n"); 71 for(j=1;j<=hour[n];j++) 72 printf("%-4d",dp[i][j]); 73 } 74 printf("\n");*/ 75 printf("%d\n",maxn); 76 } 77 return 0; 78 }
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("\n"); 33 // } 34 // printf("%d\n",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("\n"); 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\n",dp[0][5]); 66 // printf("%d %d %d\n",dp[1][4],dp[1][5],dp[1][6]); 67 } 68 return 0; 69 }
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\n",dp[0][5]); 32 } 33 return 0; 34 }