1 条题解

  • 0
    @ 2025-10-10 15:48:08

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    
    //p:存放数组的坐标及坐标对应的花生数量 
    int m,n,k,a[30][30],p[1000][3];
    
    int main(){
    	int i,j,s = 0;
    	//读入数据 
    	cin>>m>>n>>k;
    	for(i = 1;i <= m;i++){
    		for(j = 1;j <= n;j++){
    			cin>>a[i][j];
    			if(a[i][j] > 0){
    				p[s][0] = i;
    				p[s][1] = j;
    				p[s][2] = a[i][j];
    				s++;
    			}
    		}
    	}	
    	
    	//对p数组按照花生数量由大到小排序
    	for(i = 1;i < s;i++){
    		for(j = 0;j <= s - i - 1;j++){
    			if(p[j][2] < p[j+1][2]){
    				swap(p[j],p[j+1]);
    			}
    		}
    	} 
    	
    	//统计时间和摘到的花生数量
    	int time = 0;
    	int sum = 0;
    	//遍历每个花生点
    	for(i = 0;i < s;i++){
    		//如果是第一个花生点
    		if(i == 0){
    			if(p[i][0] + 1 + p[i][0] <= k){
    				time = p[i][0] + 1;
    				sum = sum + p[i][2];
    			}else{
    				break;
    			}
    		}else{
    			if(time + abs(p[i][0]-p[i-1][0]) + abs(p[i][1]-p[i-1][1]) + 1 + p[i][0] <= k){
    				time = time + abs(p[i][0]-p[i-1][0]) + abs(p[i][1]-p[i-1][1]) + 1;
    				sum = sum + p[i][2];
    			}else{
    				break;
    			}
    		} 
    	} 
    	
    	cout<<sum<<endl;
    }
    
    
    

    Pascal :

    program liumohan;
    type date=record
    x,y,d:longint;
    end;
    var a:array[1..40000]of date;
    k,i,j,m,n,q,t,w,p:longint;
    procedure qsort(l,r:longint);
    var i,j:longint;
    m,t:date;
    begin
    i:=l;
    j:=r;
    m:=a[(l+r)shr 1];
    repeat
    while a[i].d<m.d do inc(i);
    while a[j].d>m.d do dec(j);
    if i<=j then begin
    t:=a[i];
    a[i]:=a[j];
    a[j]:=t;
    inc(i);
    dec(j);
    end;
    until i>j;
    if l<j then qsort(l,j);
    if i<r then qsort(i,r);
    end;
    begin
    read(m ,n,k);
    p:=n*m ;
    for i:=1 to p do
    begin
    read(a[i].d);
    if i mod n=0 then a[i].x:=trunc(i/n) else
    a[i].x:=trunc(i/n)+1;
    if ((i mod n)=0)then a[i].y:=n else
    a[i].y:=i mod n;
    end;
    if (n=1 )and( m =1) and (k>3) then begin write(a[1].d);halt;end;
    qsort(1,p);
    t:=a[p].x+1;
    w:=a[p].d;
    if t+a[p].x>k then begin write(0);halt;end;
    for i:=p-1 downto 1 do
    begin
    q:=t+abs(a[i].x-a[i+1].x)+abs(a[i].y-a[i+1].y)+1;
    if (q+abs(a[i].x))>k then
    begin write(w);halt;end;
    if (q+abs(a[i].x)<=k) and (a[i].d=0) then
    begin write(w);halt;end
    else
    begin
    t:=q;
    w:=w+a[i].d;
    end;
    end;
    end.
    
    • 1

    信息

    ID
    462
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者