6 条题解

  • 2
    @ 2025-7-4 13:58:01
    using namespace std;
    struct node{
    	int x,y;
    	int sum;
    } a[500];
    bool cmp(node x,node y){
    	return x.sum>y.sum;
    }
    int n,m,k,x,ans;
    int main(){
    	cin>>n>>m>>k;
    	int s=0;
    	for (int i=1;i<=n;i++) 
    	  for (int j=1;j<=m;j++) {
    	  	  cin>>x;
    	  	  	   s++;
    	  	  	   a[s].x=i;
    	  	  	   a[s].y=j;
    	  	  	   a[s].sum=x;
    	  }
    	sort(a+1,a+1+s,cmp);
        int t=1,sx=0;
        int sy=a[t].y;
        while(k>=abs(a[t].x-sx)+abs(a[t].y-sy)+1+a[t].x) {
        	ans+=a[t].sum;
        	k=k-(abs(a[t].x-sx)+abs(a[t].y-sy)+1);
        	sx=a[t].x;
        	sy=a[t].y;
        	t++;
    	}
    	cout<<ans;
    	return 0;
    }
    
    • 1
      @ 2023-10-4 9:42:37

      声明:本题洛谷有原题,想C的去C题解。怕你们说题解代码和我一样

      结构体+排序+模拟

      结构体

      struct T {
          int i;//记录行位置
          int j;//记录列位置
          int num;//该位置花生数量
      } ;
      

      排序,按照花生的数量的大小递减

      bool cmp(T a, T b){
          return a.num>b.num;
      }
      

      模拟

      • pre_i,pre_jpre\_i,pre\_j 记录前一次采摘位置,用于计算位移
      1. 先减去到路边和回路上的消耗 k -=2
      2. 第一棵只要减去横坐标即可 k -=(位移i - 1+采摘 1)
      3. 第i棵(i>=2)要减去位移和采摘时间 k -= (位移)-(采摘)

      $k -= abs(peanut[i].i - pre_i)+abs(peanut[i].j - pre_j)+1;$

      1. 判断如果采摘了该棵能否回到路边k>=peanut[i].i1 (k>= peanut[i].i -1)
      2. 优化,不能回到路边或者花生数量为0时跳出循环
      • 0
        @ 2025-7-4 8:36:52

        #include <bits/stdc++.h> using namespace std; int n,m,k,a[1000][1000],c[1000],d[1000],w,s; struct node{ int x,y,z; }b[1000]; bool cmp(node h,node l){ return h.x>l.x; } int main() { cin>>n>>m>>k; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(a[i][j]>=0){ b[++w].x=a[i][j]; b[w].y=i; b[w].z=j; } } sort(b+1,b+w+1,cmp); c[1]=1+b[1].y*2; d[1]=1+b[1].y; for(int i=2;i<=w;i++){ d[i]=1+abs(b[i].y-b[i-1].y)+abs(b[i].z-b[i-1].z); c[i]=d[i]+b[i].y; } for(int i=1;i<=w;i++){ if(k<c[i])break; s+=b[i].x; k-=d[i]; } cout<<s; return 0; }

        • 0
          @ 2023-10-4 9:44:34

          注意:比如这样的情况,不能走红线,只能老老实实走蓝色路

          • -2
            @ 2023-10-4 11:49:06
            #include<bits/stdc++.h>
            using namespace std;
            int x,ans,sum,m,n,k,cnt,t;
            struct Node
            {
            	int x,y;
            	int num;
            }a[450];
            bool cmp(Node p,Node q)
            {
            	return p.num>q.num;
            }
            int main()
            {
            	cin>>m>>n>>k;
            	for(int i=1;i<=m;i++)
            	{
            		for(int j=1;j<=n;j++)
            		{
            			cin>>x;
            			if(x>0){
            				cnt++;
            				a[cnt].num=x;
            				a[cnt].x=i;
            				a[cnt].y=j;
            			}
            			
            		}
            	}
            	sort(a+1,a+cnt+1,cmp);
            	sum=1+a[1].x;
            	if(sum+a[1].x<=k) ans=ans+a[1].num;
            	else {
            		cout<<0;
            		return 0;
            	}
            	for(int i=2;i<=cnt;i++)
            	{
            		sum=sum+1+abs(a[i-1].x-a[i].x)+abs(a[i-1].y-a[i].y);
            		if(sum+a[i].x<=k) ans=ans+a[i].num;
            		else break;
            	}
            	cout<<ans<<endl;
            	return 0;
            }
            
            • -3
              @ 2024-4-18 16:27:46

              自己看代码(对于xxs们)

              #include <bits/stdc++.h>
              using namespace std;
              struct shen {
              	int x,y;
              	int sum;
              } a[500];
              bool cmp (shen x,shen y) {return x.sum>y.sum;}
              int n,m,k;
              int x;
              int ans;
              int main() {
              	cin>>n>>m>>k;
              	int s=0;
              	for (int i=1;i<=n;i++) 
              	  for (int j=1;j<=m;j++) {
              	  	  cin>>x;
              	  	  	   s++;
              	  	  	   a[s].x=i;
              	  	  	   a[s].y=j;
              	  	  	   a[s].sum=x;
              	  }
              	sort (a+1,a+1+s,cmp);
                  int t=1,sx=0;
                  int sy=a[t].y;
                  while (k>=abs (a[t].x-sx)+abs (a[t].y-sy)+1+a[t].x) {
                  	ans+=a[t].sum;
                  	k=k-(abs (a[t].x-sx)+abs (a[t].y-sy)+1);
                  	sx=a[t].x;
                  	sy=a[t].y;
                  	t++;
              	}
              	cout<<ans;
              	return 0;
              }
              
              • 1

              信息

              ID
              160
              时间
              1000ms
              内存
              256MiB
              难度
              6
              标签
              (无)
              递交数
              278
              已通过
              93
              上传者