列表

详情


NC244323. 放羊的贝贝

描述

贝贝因为太菜了,被学校辍学回家放羊。贝贝的家在一个大草原上,大草原可以视为二维坐标系中的一个大矩形,左下角坐标为(0, 0),右上角坐标为(n,m)。而羊圈可以为一个小矩形,左下角坐标为(a, b),右上角坐标为(c, d),另外还有k头不在羊圈中的羊,每头羊占据面积为的单元格,左下角为(x_i,y_i),右上角为。贝贝想让精灵Tenshi用魔法将羊圈和羊群都围在同一个封闭的多边形中,这样贝贝就可以省去麻烦的赶羊体力活了。Tenshi每将(其中x,y均为整数)生成围栏的时候,就会耗费1点能量,围栏可以与羊圈、羊儿所占领的区域的边缘紧贴。因为Tenshi是贝贝的精灵,贝贝不忍心他耗费过多的能量,所以他希望花费的能量越少越好,现在请你求出这个最小的能量。

输入描述

第一行,包含三个整数
第二行,包含四个整数a,b,c,d
接下来的k行,每行两个整数x_i,y_i
数据保证羊圈和羊儿的位置均位于大草原之中。

输出描述

仅一行,输出一个整数,表示需要花费的最小的能量。

示例1

输入:

100 100 4
2 2 4 4
1 1
2 1
0 2
1 3

输出:

14

说明:

使用圆圈所占领的1\times 1的格子表示羊儿的位置,虚线表示羊圈的位置,橙色实线表示最后围起来的封闭多边形(围栏),蓝色顶点表示表示该多边形的顶点。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 26ms, 内存消耗: 356K, 提交时间: 2022-10-21 23:55:47

#include<stdio.h>
int main()
{
	long long int n,m,k,a,b,c,d,x,y;
	scanf("%lld %lld %lld",&n,&m,&k);
	scanf("%lld %lld %lld %lld",&a,&b,&c,&d);
	for(int i=0;i<k;i++)
	{
		scanf("%lld %lld",&x,&y);
		a=x<a?x:a;
		b=y<b?y:b;
		c=x+1>c?x+1:c;
		d=y+1>d?y+1:d;
	}
	printf("%lld",(c-a+d-b)*2); 
}

pypy3 解法, 执行用时: 374ms, 内存消耗: 60424K, 提交时间: 2022-10-22 08:59:32

n,m,k=map(int,input().split())
a,b,c,d=map(int,input().split())
lx=[]
ly=[]
for i in range(k):
    x,y=map(int,input().split())
    lx.append(x)
    ly.append(y)
lx.append(a)
lx.append(c-1)
ly.append(b)
ly.append(d-1)
e=max(lx)
f=max(ly)
g=min(lx)
h=min(ly)
print((e-g+1)*2+(f-h+1)*2)

C++(g++ 7.5.0) 解法, 执行用时: 74ms, 内存消耗: 1416K, 提交时间: 2022-10-22 19:38:33

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n,m,k;cin>>n>>m>>k;
	int a,b,c,d;cin>>a>>b>>c>>d;
	for(int i=1,x=0,y=0;i<=k;i++)
    {
		cin>>x>>y;
		a=min(a,x);c=max(c,x+1);
		b=min(b,y);d=max(d,y+1);
	}
	printf("%lld",2ll*(c-a+d-b));
}

C++(clang++ 11.0.1) 解法, 执行用时: 67ms, 内存消耗: 428K, 提交时间: 2022-10-21 19:03:22

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n,m,k;cin>>n>>m>>k;
	int a,b,c,d;cin>>a>>b>>c>>d;
	for(int i=1,x,y;i<=k;i++){
		cin>>x>>y;
		a=min(a,x);c=max(c,x+1);
		b=min(b,y);d=max(d,y+1);
	}
	printf("%lld",2ll*(c-a+d-b));
}

Python3 解法, 执行用时: 531ms, 内存消耗: 7168K, 提交时间: 2022-10-25 22:01:41

k=int(input().split()[2])
a,b,c,d=map(int,input().split())
for _ in range(k):
    x,y=map(int,input().split())
    a=min(a,x)
    b=min(b,y)
    c=max(c,x+1)
    d=max(d,y+1)
print(d+c-a-b<<1)

上一题