题意:有一片矩形花生田在路的一侧,田上的整数坐标位置有0个或多个花生,现规定从路上走到田地最边上的某个格点位置、从田边上走回路上、从一个格点移动到另一个格点、采摘格点上的花生,这四种动作都要花费一单位的时间,每次必须采摘花生数最多的格点,给出限定时间,问能采多少花生。
我一开始没有看见每次必须采摘花生数最多的格点,于是,我考虑了状压 DP 这种高端做法```本来又该满心欢喜地敲的时候发现样例并通不过```我百思不得其解后重新研读了一下题意才发现那个条件```于是```并不是高端的 DP 题,而是一道彻头彻尾的水题啊!只是模拟一下采花生的路线,反正路线肯定是从大到小固定的,然后就这样算每次的时间会不会超时,如果不超时就继续下一个点,如果超时了就输出上一个点的花生数。
中间我还RE了两法,原因是我的c初始化位置放错,导致c在循环中一直增加最终越界```低级错误啊```
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<math.h> 5 using namespace std; 6 7 struct point{ 8 int x,y,n; 9 }p[10000]; 10 11 int dp[10000],t[10000]; 12 13 int cmp(point p1,point p2){ 14 return p1.n>p2.n; 15 } 16 17 int main(){ 18 int T; 19 while(scanf("%d",&T)!=EOF){ 20 int M,N,K; 21 int i,j,k; 22 for(int q=1;q<=T;q++){ 23 int c=0; 24 memset(p,0,sizeof(p)); 25 memset(dp,0,sizeof(dp)); 26 memset(t,0,sizeof(t)); 27 scanf("%d%d%d",&M,&N,&K); 28 for(i=1;i<=M;i++){ 29 for(j=1;j<=N;j++){ 30 int n; 31 scanf("%d",&n); 32 if(n){ 33 c++; 34 p[c].x=i; 35 p[c].y=j; 36 p[c].n=n; 37 } 38 } 39 } 40 sort(p+1,p+c+1,cmp); 41 for(i=1;i<=c;i++){ 42 if(i==1)t[i]=p[i].x+1; 43 else t[i]=1+t[i-1]+abs(p[i].x-p[i-1].x)+abs(p[i].y-p[i-1].y); 44 if(t[i]+p[i].x>K)break; 45 else{ 46 dp[i]=dp[i-1]+p[i].n; 47 } 48 } 49 printf("%d\n",dp[i-1]); 50 } 51 } 52 return 0; 53 }
时间: 2024-11-02 18:40:57