I Gree的心房(CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019))

题目描述
据说每一个走进Gree哥哥心房的小姑娘都没有能够再走出来……
我们将Gree哥哥的心房抽象成一个n×m的地图,初始所有点均为空。当小姑娘走入他的心房时(此时小姑娘的位置为 (1,1) 点),他会将kk 个1×1 障碍物放入地图来阻止小姑娘的行动,每个位置最多只能放置一个障碍物(即不能叠加放置)。但由于Gree哥哥被小姑娘的美貌所捕获,并没有一套很好的策略去放置这些障碍物,于是就随机放置这些障碍物。
在Gree随机地把所有障碍物放置好之后,小姑娘要从地图的左上角 (1,1)走到右下角 (n,m)。(起点和终点不能放置障碍物)
小姑娘每一步可以往上下左右的任意一个方向移动一个单位,在所有的障碍物放置方案中,小姑娘从左上角走到右下角需要的最少步数是多少?(小姑娘会尽量走最短的路线)
如果没有一个合理的放置方案,或无论怎样放置障碍物小姑娘都无法到达右下角,输出 -1.

输入描述
输入包含三个正整数 n,m,k。。 (1<=n,m,k<=1e5)
输出描述
输出一个整数表示答案。

样例输入 
3 3 2
样例输出
4

提示
若用 00 表示空地,11 表示此地被放置了障碍物。则其中的一种放置方案为:

00 00 11
11 00 00
00 00 00


在这种情况下,从左上角到右下角的步数为 44。且这种方案是小姐姐需要步数最少的方案。(当然也有其他方案也可以让小姐姐4步就能到达终点)

思路:我们尽可能留住一条最近的路,假设将障碍物尽可能都放在左下角(其他可以通过移动将货物放在左下角),因为不能重叠货物,所以最多只能放(n-1)*(m-1)的障碍物,步数就是n+m-2.

 

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <set>
#define MAX 0x3f3f3f3f
#define fori(a,b) for(int i=a;i<=b;i++)
#define forj(a,b) for(int j=a;j<=b;j++)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const double PI = acos(-1);
const int M=1e5+10;
#define inf 0x3f3f3f
int a[M];
int main()
{
    ll n,m,k;
    cin>>n>>m>>k;
    ll p=(n-1)*(m-1);
    if(k<=p)
        cout<<n+m-2<<endl;
    else
        cout<<"-1"<<endl;
    return 0;
}

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值