문제에 루오 구 P1086 땅콩 따기 솔루션

P1086은 땅콩 따기

제목 설명

미스터 로빈슨은 많은라는 이름의 애완 동물 원숭이가 있습니다. 그 날, 그 중 두 국가로 따라 산책되고, 갑자기 길가 광고판에 붙어 종이의 작은 조각을 발견 : "나는 무료 시음 땅콩 종을 환영합니다 - 단어를 곰을!"

미스터 로빈슨 매우 행복 많은, 땅콩 자신이 좋아하는이기 때문이다. 징후 뒤에, 길가 정말 깔끔하게 사각형 격자로 배열 땅콩 필드 땅콩 식물 (그림 11)이있다. 경험이 풍부한 눈이 많이, 얼마나 많은 각 그들의 땅콩 공장에서 땅콩이 있습니다. 등등과 대부분의 땅콩, 땅콩을 선택하는 경우 다음 공장의 나머지 부분을 찾아, 당신은 먼저 땅콩을 선택하는 가장 큰 땅콩 공장을 찾아 "연산을 많이 양성하기 위해, 미스터 로빈슨은 말했다 하지만 당신은 내 제한된 시간에 도로의 측면으로 돌아 가야한다. "

우리는 시간의 각 단위의 많은, 당신은 하나에 다음과 같은 네 가지 일을 할 수 있다고 가정합니다 :

  1.  从路边跳到最靠近路边(即第一行)的某棵花生植株;
    
  2.  从一棵植株跳到前后左右与之相邻的另一棵植株;
    
  3.  采摘一棵植株下的花生;
    
  4.  从最靠近路边(即第一行)的某棵花生植株跳回路边。
    

이제 땅콩과 땅콩 필드의 크기의 분포 주어, 얼마나 많은 땅콩을 많이 선택하는, 제한된 시간을 요청? 땅콩 공장의 일부가 서로 다른 땅콩 식물의 수를 가정 아래 성장합니다.

예를 들어, 땅콩 필드도. 2 단 (2, 5), (3, 7), (4,2), (5,4) 땅콩 식물 성장의 각각 13의 수 (7)에 위치한 15, 9. 시간의 21 개 단위의 많은에서 경로를 따라 일러스트, 그것은 37 개 땅콩까지 촬영할 수 있습니다.

입력 형식

첫 번째 라인은 세 개의 정수 포함 \ (M \) , \ (N \)\ (K를 \) , 공백으로 구분 필드는 땅콩의 크기를 나타내는 \을 (M \ 시간 N (1 \ 르 M, N \ 20 \)) 르이며 , 많은 시간이 땅콩 광산으로서 정의된다 \ (K (0 \ 르 K \ 르 1000) \) 의 시간 단위. 다음 \ (M \) 행, 음이 아닌 정수 NN을 포함하는 각각의 행은, 또한 공간에 의해 분리 된, 단면 \ (I + 1 \) 광고에 \ (J \) 정수 (\ P_ {IJ} ( 0 \ 르 IJ P_ {} \ 르 500) \) 땅콩 식물의 필드를 나타낸다는 ) \) \ ((I는 j 개의 땅콩의 수, 땅콩 0은 식물이 없음을 나타낸다.

출력 형식

제한된 시간 내에 정수, 즉, 땅콩의 많은 번호를 선택합니다.

샘플 입출력

입력 # 1

6 7 21
0 0 0 0 0 0 0
0 0 0 0 13 0 0
0 0 0 0 0 0 7
0 15 0 0 0 0 0
0 0 0 9 0 0 0
0 0 0 0 0 0 0

출력 # 1

(37)

입력 # 2

6 7 20
0 0 0 0 0 0 0
0 0 0 0 13 0 0
0 0 0 0 0 0 7
0 15 0 0 0 0 0
0 0 0 9 0 0 0
0 0 0 0 0 0 0

출력 # 2

(28)

설명 / 팁

그룹이 제목의 noip2004 인기

[생각]

사용시 : 40 분
검색 + 아날로그
땅콩 이야기를 선택하십시오. . . . .
이 질문은 내가 주제의 중요성을 이해 그렇게 읽은 후에 이루어집니다!

첫번째 입력 데이터, 위치 및 수는 없다 0 땅콩 A의 구조 저장할
완료 순서화 땅콩의 개수에 따라 상기 구조의 입력
순서가 촬영되는 작업 순서를

그런 과정, 시뮬레이션 순서로 보면
, 각 보조 임무 목표를 열거 도달하기
에 도달 할 정도로 나머지 K보고 따기 돌아가
그것을 배치 할 시간이 충분하지 않은 경우
촬영되었습니다 좋은 직접이 땅콩 휴가
때문에이 돌아 갈 수 없어 너무 판단 된 지점에 도달하기 전에
충분히 포인트가 사용하기 전에 너무 시간에 대해 걱정하지 마십시오
(가) 백업 할 수 있습니다에 직접

남은 시간이 충분하면,
그 시점에 도달 플러스 ANS 땅콩 수
땅콩 따기 요구되는 시간의 도달 시각을 감산함으로써 K 필요한
그 다음 포인트 행하는

첫번째 점의 첫 번째 라인에 가장 가까운 위치에서 직접 접속하기 때문에
,이 요구되는 시간 포인트 x는
하지만 도착의 다른 지점에서의 점 전에 x와 y와 x와 y 사이의 차이의 절대 값 인
두 종은 다르다
그래서 첫 번째 점에서 별도로 취급, 또는 구조에 속임수
주석 내부의 코드에서이 작은 손과 발

[전체 코드]

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>

using namespace std;
const int Max = 25;

int f[Max][Max];
struct node
{
    int x,y,z;
}a[Max * Max];
int sum = 0;

bool cmp(const node x,const node y)
{
    return x.z > y.z;
}

int main()
{
    int m,n,k;
    scanf("%d%d%d",&m,&n,&k);
    for(int i = 1;i <= m;++ i)
        for(int j = 1;j <= n;++ j)
        {
            scanf("%d",&f[i][j]);
            if(f[i][j] != 0)
            {
                a[++ sum].x = i;
                a[sum].y = j;
                a[sum].z = f[i][j];
            }
        }
    sort(a + 1,a + sum + 1,cmp);
    int ans = 0;
    a[0].y = a[1].y;//小手脚
    //将1的前一个0 的y变为和1的y一样,那这样减去之后就会等于0了,就不会影响了 
    for(int i = 1;i <= sum;++ i)
    {
        if( abs(a[i].x - a[i - 1].x) + abs(a[i].y - a[i - 1].y) + 1 + a[i].x <= k)
        {
            k -= abs(a[i].x - a[i - 1].x) + abs(a[i].y - a[i - 1].y) + 1;
            ans += f[a[i].x][a[i].y];
        }
        else
        {
            cout << ans << endl;
            return 0;
        }
    }
    cout << ans << endl;
    return 0;
}

추천

출처www.cnblogs.com/acioi/p/11610219.html